#include <stdio.h>
int main()
{
int a[0],b[4][0];
printf("%d %d ",sizeof(a),sizeof(b));
}
//output
0 0
a[0]
的意義是什麼,爲什麼還允許2號大小爲0的數組?C中0長度數組的意義是什麼?
#include <stdio.h>
int main()
{
int a[0],b[4][0];
printf("%d %d ",sizeof(a),sizeof(b));
}
//output
0 0
a[0]
的意義是什麼,爲什麼還允許2號大小爲0的數組?C中0長度數組的意義是什麼?
C和C++都不允許零長度的數組,所以你的程序不合格。
(例如,C++ 11,8.3.4/1: 「[數組大小]應大於零」。)
(作爲基本原理的一個點:零長度的陣列將是棘手的並混淆與要求每個對象有一個唯一的地址)
正如@sidyll指出,零長度數組在GCC中可用作extension。
如果您正在使用C99
- 靈活的數組成員被寫成內容[]不爲0
- 靈活的數組成員有不完整的你會發現在The GCC manual
你的答案類型,所以sizeof運算符可能不適用。作爲零長度數組原始實現的一個怪癖,sizeof的計算結果爲零。
- 靈活的數組成員可能只能作爲非空的結構的最後一個成員出現。
- 包含靈活數組成員的結構或包含這種結構的聯合(可能是遞歸的)可能不是結構的成員或數組的元素。 (然而,這些用途是通過GCC允許作爲擴展
當然而且,它們如何可能是有用的:
零長度數組被允許在GNU C.它們是非常有用的作爲結構的最後一個元件,它是真正爲一個可變長度的對象的報頭:
struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length;
在C11和C99中,'sizeof'並不總是編譯時操作符(僅在C89中)。 – 2011-12-24 16:33:11
沒有如在例子中給出多大用處,但零尺寸數組S IN結構進行了頻繁使用,其中的最後一個元素是動態調整:
struct {
int some_fixed_data [N_FIXED];
float more_fixed_size_data [F_FIXED];
int n_variable_elements;
long variable_elements [0]; // allocated based on item above
} s;
int curlen = sizeof s + sizeof long * s.n_variable_elements;
使用零長度數組的是:
1)variable_elements
具有地址(儘管某人的回答)
2)它還具有陣列語義
3)計算所述陣列的動態大小是簡化
不幸的是,一些編譯器(MSC)拋出一個噓聲像配合在這樣的結構中,並迫使在較小,安撫,在技術上不正確重新配製:
struct {
int some_fixed_data [N_FIXED];
float more_fixed_size_data [F_FIXED];
int n_variable_elements;
long variable_elements [1]; // allocated based on item above
} s;
int curlen = sizeof s + sizeof long + (s.n_variable_elements - 1);
將零大小數組看作佔位符。除非你被迫使用C
這是很多嵌入式環境的情況,否則幾乎沒有必要這樣做。
它沒有在gcc編譯器中給出錯誤ubuntu 10.04 – 2011-12-24 16:18:25
@ user1044137:有很多很多種方法來編寫格式不正確的C和C++程序,並且您沒有收到診斷信息。對於這個問題,我的GCC說'警告:ISO C++禁止零大小的數組'。您應該始終啓用所有警告。 – 2011-12-24 16:20:23
爲什麼用** C++ **編譯器從** C **問題編譯** C **程序併發布** C++ **標準摘要? – sidyll 2011-12-24 16:28:08