由于0長度數組是GNU C的擴展,有一些巧妙編寫的詭異代碼,其執行結果就是依賴于編譯器和優化策略的實現的,我們來看看以下代碼:
#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;
}
編譯結果是:
可以看到a和b的地址就會被編譯器優化到一處,因為a[0] 和 b[0] 對于程序來說是無法使用的,同樣編譯器對于相同字符串常量,往往地址也是優化到一處,減少空間占用。
所以其本質上涉及到的是一個C語言里面的數組和指針的區別問題,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]
本質上是否有區別?我們可以通過一個例子來說明。
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
代碼
+關注
關注
30文章
4779瀏覽量
68521 -
編譯器
+關注
關注
1文章
1623瀏覽量
49108 -
數組
+關注
關注
1文章
417瀏覽量
25939
發布評論請先 登錄
相關推薦
請問如何將幾十K大小的數組存放在flash里面,不占用內存空間呢?
請問如何將幾十K大小的數組存放在flash里面,不占用內存空間呢?
用了const好像不管用,還是占用了heap空間。
發表于 07-19 07:10
單片機的存儲空間不夠用了,有哪些解決辦法?
數據或程序;還可以對數據進行壓縮處理,在不影響功能的前提下,減少數據占用的存儲空間;另外,根據實際需求,重新選擇存儲空間更大的單片機型號也是一個可行的方案。
上面說發是否正確a
發表于 10-15 22:33
用C語言編程,如何節省存儲空間
問題,變量有大有小呀,對的,所以這個時候共用體的空間為內部變量最大占用空間的值。如此這般,共用體就可以通過共享存儲空間,來避免當前沒有被使用的變量所造成的
發表于 11-19 11:34
C語言存儲空間與MCU(單片機)
首先,最近因公司項目需求,暫時學習的去做單片機的開發,因此,需要具備的C編程語言,結合自己以前的移動App開發,總結出如下C語言的常規基礎知識;一:存儲空間本節介紹nX-U8 內核支持的存儲空間。二
發表于 10-28 09:41
?11次下載
云存儲空間已滿怎么辦?
云存儲空間已滿怎么辦?當云存儲空間已滿時,我們可以采取以下一些常見的步驟來解決問題: 1、刪除不必要的文件: 首先,檢查云存儲中是否有不再需要的文件或數據。刪除這些文件可以立即釋放存儲空間
評論