C/C++中常用char a[0]來定義一個占位符,用以指示一個內存地址。例如,柔性數組的定義:
struct Array{
int len;
int data[0];
}
結構體Array用來標識一個數組,len為其長度,數據存在data中。因為數組的長度是動態的,所以經常在程序中動態分配數組的內存:
int len = 100;
struct Array * pa = malloc( sizeof(Array) + sizeof(int) * len);
pa->len = len;
//訪問數組元素
pa->data[0];
這里結構體中的data就是一個占位符,編譯器不會給它分配內存。
pa->data或&pa->data表示的是len的下一個地址單元,這里是一個int。
sizeof( Array ) 與sizeof( int ) 相等都是4.
因為sizeof( pa->data ) 的值是0.
當把data當着指針使用時,有以下注意事項:
pa->data + 10 等於&pa->data + 10 * sizeof(int). 但是
&pa->data + 10 等於&pa->data + 10 * sizeof( int [0] ), 因為sizeof( int [0] ) 等於0 ,所以 &pa->data + 10 與 &pa->data的值相等!!
可以這樣理解typeof( pa->data) 是int,因為C語言中數組名就是數組第一個元素的地址。
而 &pa->data是取data的地址,data的類型是 int [0], 即0長度的int數組,所以它的size為0.
在0長度的數組上,指針無論怎么移動,其仍然在原來的位置。
另外:
gcc中,可以根據需要指定結構的字節對齊方式:
typedef struct{
char * name;
int ag;
char score;
int id;
}__attribute__((packed)) Person1;
Person1是字節對齊的。
typedef struct{
char * name;
int age;
char score;
int id;
}__attribute__((aligned (4))) Person2;
Person2是4字節對齊的。注意(4)前面有個空格。