由于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ū)別?我們可以通過一個例子來說明。
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
代碼
+關(guān)注
關(guān)注
30文章
4967瀏覽量
73935 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51577 -
數(shù)組
+關(guān)注
關(guān)注
1文章
420瀏覽量
27351
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
嵌入式中零長度數(shù)組基本操作方法
C語言零長度數(shù)組,聽起來可能有點奇怪,因為它沒有分配內(nèi)存空間,無法存儲數(shù)據(jù)。但實際上,零長度數(shù)組在Linux內(nèi)核中隨處可見。 零長度數(shù)組的定
請問如何將幾十K大小的數(shù)組存放在flash里面,不占用內(nèi)存空間呢?
請問如何將幾十K大小的數(shù)組存放在flash里面,不占用內(nèi)存空間呢?
用了const好像不管用,還是占用了heap空間。
發(fā)表于 07-19 07:10
字存儲空間的小端格式
地址空間內(nèi)。存儲器中字節(jié)組織為小端格式。一個字存儲空間的最低字節(jié)數(shù)據(jù)為字的最低有效位,最高字節(jié)數(shù)據(jù)為最高有效位。
例:將 0x1122 3344 存放在地址為
發(fā)表于 12-11 07:03
I/O存儲空間什么意思?
DSP的片內(nèi)存儲,不是只有程序存儲空間區(qū)(RAM)和數(shù)據(jù)存儲空間區(qū)(ROM)嗎?那個 I/O存儲空間區(qū)是什么意思?它屬于片內(nèi)存儲嗎?
發(fā)表于 05-29 21:26
用C語言編程,如何節(jié)省存儲空間
問題,變量有大有小呀,對的,所以這個時候共用體的空間為內(nèi)部變量最大占用空間的值。如此這般,共用體就可以通過共享存儲空間,來避免當前沒有被使用的變量所造成的
發(fā)表于 11-19 11:34
采用存儲空間循環(huán)使用方法達到延長flash使用壽命
本存儲代碼占用Ram資源極少,不占用Flash用于存儲數(shù)據(jù)的空間,采用存儲空間循環(huán)使用方法達到延
發(fā)表于 01-26 06:25
C語言存儲空間與MCU(單片機)
首先,最近因公司項目需求,暫時學習的去做單片機的開發(fā),因此,需要具備的C編程語言,結(jié)合自己以前的移動App開發(fā),總結(jié)出如下C語言的常規(guī)基礎(chǔ)知識;一:存儲空間本節(jié)介紹nX-U8 內(nèi)核支持的存儲空間。二
發(fā)表于 10-28 09:41
?11次下載
云存儲空間已滿怎么辦?
云存儲空間已滿怎么辦?當云存儲空間已滿時,我們可以采取以下一些常見的步驟來解決問題: 1、刪除不必要的文件: 首先,檢查云存儲中是否有不再需要的文件或數(shù)據(jù)。刪除這些文件可以立即釋放存儲空間
0長度數(shù)組不占用存儲空間
評論