Showing posts with label Notice. Show all posts
Showing posts with label Notice. Show all posts

Wednesday, March 7, 2012

位置轉換 printf("%f",5);的問題

#inlcude
int main()
{
printf("%f",5);
printf("%d",5.01);
}

首先參數5為int型別,32位元平臺中為4位元組,因此在stack中分配4位元組的記憶
體,用於存放參數5。
然後printf根據說明符"%f",認為參數應該是個double型別(在printf函式中,float會自
動轉換成double),因此從stack中讀了8個位元組。
很顯然,記憶體存取越界,會發生什麼情況不可預料。如果在printf或者scanf中指定了"%f"
,那麼在後面的參數列表中也應該指定一個浮點數,或者一個指向浮點變數的指標,否則不應載
入支援浮點數的函式。

於是("%f",5)有問題,而("%f",5.0)則可行。


答案:
第一個答案是0.000000
第二個答案是一個大數



.

Friday, March 2, 2012

C++陣列過大造成stack overflow?

C++陣列過大造成stack overflow?

像這兩個會爆
//long long a[130000]={0};
//int a[260000]={0};


.

指標變數 vs 常數指標

指標變數 vs 常數指標
1.
char *ptr="123456";
ptr[0]='a'; //error
//因為*ptr在此是全域常數

2.
char ptr[]="123456";
ptr[0]='a'; //ok
//因為ptr在此是區域變數




.

Dangling Pointer 迷途指標 vs 空指標

當delete一個指標的時候,實際上僅是讓編譯器釋放記憶體,但指標本身依然存在。這時
它就是一個迷途指標。

當使用以下敘述時,可以把迷途指標改為空指標:
MyPtr=0;

通常,如果在刪除一個指標後又把它刪除了一次,程式就會變得非常不穩定,任何情況
都有可能發生。但是如果你只是刪除了一個空指標,則什麼事都不會發生,這樣做非常
安全。

使用迷途指標或空指標(如MyPtr=0)是非法的,而且有可能造成程式當機。如果指標是
空指標,儘管同樣是當機,但它同迷途指標造成的當機相比是一種可預料的當機。這樣
除錯起來會方便得多。

(擷取自程式設計師面試寶典)



維基百科進一步解釋

.