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”的內容。
?
在讀程序中經常會看到這樣的定義char data[0],這是一個什么樣的用法,有什么好處,在哪些地方用到?
本文的主要目的就是闡明這個定義的作用,以及適用范圍,這需要對指針的概念和操作系統的內存模型有一個情形的認識。
首先看一段程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
?
typedef struct _Info
{
??? int i;
??? char data[0];
}Info;
?
int main(int argc, char* argv[])
{
??? printf("%d/n",sizeof(Info));
??? return 0;
}
程序的執行結果是:4。整數i就占了4個字節,這表明data沒有占用空間。data是一個數組名;該數組沒有元素;該數組的真實地址緊隨結構體Info之后;這種聲明方法可以巧妙的實現C語言里的數組擴展。
記住上面的結構體不同于:
typedef struct _Info
{
??? int i;
??? char* data;
}Info;
這個結構體占用8個字節的空間,因為指針類型要占用4個字節的空間。
再看一個例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
?
typedef struct _Info
{
??? int i;
??? char data[0];
}Info;
?
int main(int argc, char* argv[])
{
??? char buf[10] = "123456789";
??? void* p = NULL;
?
??? printf("%d/n",sizeof(Info));
???
??? Info* info = (Info*)malloc(sizeof(Info) + 10);
??? p = (void*)info->data;
??? printf("addr of info is %p. addr of data is %p ./n", info, p);
???
??? strcpy((char*)p, buf);
??? printf("%s/n", (char*)p);
?
??? return 0;
}
程序的執行結果見下圖:
可知,data的地址是緊隨結構體之后的。