char a[0]的使用


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)前面有個空格。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM