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