基礎 關於extern指標和陣列的用法

2021-09-07 09:11:48 字數 1335 閱讀 6479

之前有在外面面試,遇到一題如下:

filea.c

char *p = "

abcdefg";

fileb.c

extern

char

p;printf(

"p[0]=%d\n

", p[0

]);result=?

當時只是糾結於printf中的%d列印char型別資料,會不會按位址將abcd這四個位元組的資料列印出來,所以給出的答案是:0x61626364. 

類似的還有這種做法:

filea.c

char p[10

];fileb.c

extern

char

p;extern

char *p;

p[0] = ?

上面這個char p[10], p只是個別名,下面的extern char *p提取p的位址可能是0,然後對p[0]賦值可能導致程式崩潰。

之後,回來查了些資料,寫了個**試了下:

filea.c

char *str = "

abcdefg

";

fileb.c

#include "

stdio.h

"extern

char

str;

char *str2 = "

abcdef";

void main(void

)}

makefile

objects =filea.o fileb.o

hello:$(objects)

gcc -o hello $(objects)

filea.o: filea.c

fileb.o: fileb.c

clean:

rm hello $(objects)

result:

str:addr=0x00601048, -52, 6, 64

str2

[0]=a [1]=b [2]=c [3]=d [4]=e [5]=f [6]= [7]=s %

可以看出str的輸出並不是我們想要的。

為什麼呢?

首先,關於指標和陣列名

其次,由於在fileb.c中extern char str; str被申明為陣列,那麼str就是代表一塊位址空間的別名,也就是存放str指標位址空間的別名,而不是上面說道的有效資料的位址空間,所以str[0]只是存放abcdef位址空間的值。

結論:使用宣告和定義要匹配。

extern指標和陣列的用法

void main 你可以選擇除錯,或者去看彙編 但是問題的本質,也許不是那麼簡單的,因為我們選擇任何除錯的時候都是經過編譯完成之後所看到的,而這個錯誤恰恰需要我們去提前認識到在編譯的時候做了乙個怎麼樣的處理。在學習的時候也許有過這樣的解釋,指標和陣列是不同的,只是有時候可以通用而已。在extern...

關於指標陣列和陣列指標

陣列指標 舉例說明 int p 5 陣列指標的英文是 a pointer to an array 也就是指向陣列的指標。通過int p 5 p 是宣告,宣告p是乙個指標,它指向的內容是int 5 這個陣列。簡單運用下 int a 5 int p 5 a 這裡的意思也就是a是個五位的陣列,而p指向陣列...

關於「指標陣列」和」陣列指標「

我一直弄不清楚 指標陣列 和 陣列指標 的區別,最近這段時間看到了一些關於陣列和指標的關聯和區別的資料,然後總結了下這兩個概念的區別,以備後續檢視。1 區分指標陣列和陣列指標 short ptr 10 指標陣列,可理解為 存放指標的陣列 short ptr1 10 陣列指標,可理解為 指向陣列的指標...