c語言宣告長度0的陣列

2021-10-13 22:57:16 字數 806 閱讀 3661

參考:c語言結構體裡的成員陣列和指標

1 char s[0] 和 char * a比較

void zero_arr_ptr(void)

char s[0] = ;

char * a = null;

//由下面的結果可以得出:

//零長度陣列所佔記憶體空間為0,指標佔記憶體空間為4

//s和&s的結果一樣,a獲取a指向的位址,&a獲取去自身的位址;

printf("zero_arr_ptr:\n")

printf("sizeof(s)=%d,sizeof(a)=%d\n",sizeof(s),sizeof(a));

printf("s = %x,a = %x\n",s,a);

printf("&s = %x,&a = %x\n",&s,&a);

2 關於零長度陣列

首先,我們要知道,0長度的陣列在iso c和c++的規格說明書中是不允許的。這也就是為什麼在vc++2012下編譯你會得到乙個警告:「arning c4200: 使用了非標準擴充套件 : 結構/聯合中的零大小陣列」。

那麼為什麼gcc可以通過而連乙個警告都沒有?那是因為gcc 為了預先支援c99的這種玩法,所以,讓「零長度陣列」這種玩法合法了。關於gcc對於這個事的文件在這裡:「arrays of length zero」,文件中給了乙個例子(自己改了一下):

#include #include struct line 

;int main()

題外話:這裡也可以把contents改為指標,實現相應的功能。

需要注意三點區別:

C語言宣告

怎樣定義和宣告全域性變數和函式最好。首先,儘管乙個全域性變數或函式可以有多處宣告但是定義卻最多隻允許出現一次,對於全域性變數,定義是真正分配空間並賦初值的宣告,對於函式,定義是提供函式體的宣告。例如 這些是宣告 extern int i extern int f 而這些是定義 int i 1 int...

C語言 宣告

1 首先著眼於識別符號 變數名或者函式名 2 從距離識別符號最近的地方開始,依照優先順序解釋派生型別 指標,陣列和函式 優先順序如下 1 用於整理宣告內容的括弧 2 用於表示陣列的,用於表示函式的 3 用於表示指標的 例如int func p double func p是指向返回int型別的函式的指...

C語言宣告語法

概述 在很多情況下,尤其是讀別人所寫 的時候,對c語言宣告的理解能力變得非常重要,而c語言本身的凝練簡約也使得c語言的宣告常常會令人感到非常困惑,因此,在這裡我用一篇的內容來集中闡述一下這個問題。問題 宣告與函式 有一段程式儲存在起始位址為0的一段記憶體上,如果我們想要呼叫這段程式,請問該如何去做?...