由于0長度數(shù)組是GNU C的擴展,有一些巧妙編寫的詭異代碼,其執(zhí)行結(jié)果就是依賴于編譯器和優(yōu)化策略的實現(xiàn)的,我們來看看以下代碼:
#include
#include
int main(void)
{
char a[0];
printf("%pn", a);
char b[0];
printf("%pn", b);
const char *c= "Hello";
printf("%pn", c);
const char *d = "Hello";
printf("%pn", d);
return EXIT_SUCCESS;
}
編譯結(jié)果是:
可以看到a和b的地址就會被編譯器優(yōu)化到一處,因為a[0] 和 b[0] 對于程序來說是無法使用的,同樣編譯器對于相同字符串常量,往往地址也是優(yōu)化到一處,減少空間占用。
所以其本質(zhì)上涉及到的是一個C語言里面的數(shù)組和指針的區(qū)別問題,Programming Abstractions in C
一書中提到:
“arr is defined to be identical to &arr[0]”.
也就是說,char a[1]
里面的a實際是一個常量,即a = &a[0]
。而char *b
是有一個實實在在的指針變量b存在。所以,a=b
是不允許的,而b=a
是允許的。
#include
char a[1];
char *b;
int main () {
b = a;
//a=b會報錯,incompatible types when assigning to type ‘char[1]’ from type ‘char *’
a = b;
return 0;
}
兩種變量都支持下標(biāo)式的訪問,那么對于a[0]和b[0]
本質(zhì)上是否有區(qū)別?我們可以通過一個例子來說明。
審核編輯:湯梓紅
-
代碼
+關(guān)注
關(guān)注
30文章
4825瀏覽量
69038 -
編譯器
+關(guān)注
關(guān)注
1文章
1642瀏覽量
49283 -
數(shù)組
+關(guān)注
關(guān)注
1文章
417瀏覽量
26027
發(fā)布評論請先 登錄
相關(guān)推薦
評論