由于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;
}
兩種變量都支持下標式的訪問,那么對于a[0]和b[0]
本質(zhì)上是否有區(qū)別?我們可以通過一個例子來說明。
審核編輯:湯梓紅
-
代碼
+關(guān)注
關(guān)注
30文章
4880瀏覽量
69995 -
編譯器
+關(guān)注
關(guān)注
1文章
1652瀏覽量
49729 -
數(shù)組
+關(guān)注
關(guān)注
1文章
419瀏覽量
26293
發(fā)布評論請先 登錄
相關(guān)推薦
嵌入式中零長度數(shù)組基本操作方法

請問如何將幾十K大小的數(shù)組存放在flash里面,不占用內(nèi)存空間呢?
單片機的存儲空間不夠用了,有哪些解決辦法?

I/O存儲空間什么意思?
用C語言編程,如何節(jié)省存儲空間
采用存儲空間循環(huán)使用方法達到延長flash使用壽命
C語言存儲空間與MCU(單片機)

評論