void main()
你可以選擇除錯,或者去看彙編**,但是問題的本質,也許不是那麼簡單的,因為我們選擇任何除錯的時候都是經過編譯完成之後所看到的,而這個錯誤恰恰需要我們去提前認識到在編譯的時候做了乙個怎麼樣的處理。
在學習的時候也許有過這樣的解釋,指標和陣列是不同的,只是有時候可以通用而已。
在extern這個關鍵字的申明下,ar作為乙個指標變數,儲存的是乙個位址,此位址占用固定的4位元組大小,而我們所看到的陣列,陣列名是不佔儲存空間的,也就是 &陣列名,和陣列名是同乙個位址,代表的是陣列首元素的位址。這裡作為指標變數的時候指標所儲存的是四位元組dbca的阿斯克碼值,作為位址,即0x64636261。
所以第乙個printf的輸出是十進位制的1684234849;第二個printf是取乙個位元組61,阿斯克碼為a;第三個printf是對0x64636261尋找位址,程式會崩潰,因為可能訪問了乙個非法記憶體。
那麼下面的題目你也應該可以理解了吧
c.cpp中定義:
int arr=;
main.cpp中申明:
extern int *arr;
關鍵**是:
void main()
此題的關鍵問題是,陣列中所有元素都為int型別,所以他們成為位址的是低4位元組,即本題中的0x00000001
其他的分析這裡不做贅述。
基礎 關於extern指標和陣列的用法
之前有在外面面試,遇到一題如下 filea.c char p abcdefg fileb.c extern char p printf p 0 d n p 0 result 當時只是糾結於printf中的 d列印char型別資料,會不會按位址將abcd這四個位元組的資料列印出來,所以給出的答案是 0...
extern陣列與extern指標
陣列名代表了存放該陣列的那塊記憶體,它是這塊記憶體的首位址。這就說明了陣列名是乙個位址,而且,還是乙個不可修改的常量,完整地說,就是乙個位址常量。陣列名跟列舉常量一樣,都屬於符號常量。陣列名這個符號,就代表了那塊記憶體的首位址。注意了!不是陣列名這個符號的值是那塊記憶體的首位址,而是陣列名這個符號本...
extern陣列與extern指標
陣列名代表了存放該陣列的那塊記憶體,它是這塊記憶體的首位址。這就說明了陣列名是乙個位址,而且,還是乙個不可修改的常量,完整地說,就是乙個位址常量。陣列名跟列舉常量一樣,都屬於符號常量。陣列名這個符號,就代表了那塊記憶體的首位址。注意了!不是陣列名這個符號的值是那塊記憶體的首位址,而是陣列名這個符號本...