c結構體中char[0]的作用
阿新 • • 發佈:2019-01-01
struct MyData
{
int nLen;
char data[0];
}; 開始沒有理解紅色部分的內容,上網搜尋下,發現用處很大,記錄下來。
在結構中,data是一個數組名;但該陣列沒有元素;該陣列的真實地址緊隨結構體MyData之後,而這個地址就是結構體後面資料的地址(如果給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容);這種宣告方法可以巧妙的實現C語言裡的陣列擴充套件。
實際用時採取這樣:
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str ))
這樣就可以通過p->data 來操作這個str。
示例:
#include <iostream>
using namespace std;
struct MyData
{
int nLen;
char data[0];
};
int main()
{
int nLen = 10;
char str[10] = "123456789";
cout << "Size of MyData: " << sizeof(MyData) << endl;
MyData *myData = (MyData*)malloc(sizeof (MyData) + 10);
memcpy(myData->data, str, 10);
cout << "myData's Data is: " << myData->data << endl;
free(myData);
return 0;
}
輸出:
Size of MyData: 4
myData's Data is: 123456789 由於陣列沒有元素,該陣列在該結構體中分配佔用空間,所以sizeof(struct Mydata) = 4。
malloc申請的是14個位元組的連續空間,它返回一個指標指向這14個位元組,強制轉換成struct INFO的時候,前面4個位元組被認為是Mydata結構,後面的部分拷貝了“123456789”的內容。
{
int nLen;
char data[0];
}; 開始沒有理解紅色部分的內容,上網搜尋下,發現用處很大,記錄下來。
在結構中,data是一個數組名;但該陣列沒有元素;該陣列的真實地址緊隨結構體MyData之後,而這個地址就是結構體後面資料的地址(如果給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容);這種宣告方法可以巧妙的實現C語言裡的陣列擴充套件。
實際用時採取這樣:
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str
這樣就可以通過p->data 來操作這個str。
示例:
#include <iostream>
using namespace std;
struct MyData
{
int nLen;
char data[0];
};
int main()
{
int nLen = 10;
char str[10] = "123456789";
cout << "Size of MyData: " << sizeof(MyData) << endl;
MyData *myData = (MyData*)malloc(sizeof
memcpy(myData->data, str, 10);
cout << "myData's Data is: " << myData->data << endl;
free(myData);
return 0;
}
輸出:
Size of MyData: 4
myData's Data is: 123456789 由於陣列沒有元素,該陣列在該結構體中分配佔用空間,所以sizeof(struct Mydata) = 4。
malloc申請的是14個位元組的連續空間,它返回一個指標指向這14個位元組,強制轉換成struct INFO的時候,前面4個位元組被認為是Mydata結構,後面的部分拷貝了“123456789”的內容。