以下結構:ios
struct MyData
{
int nLen;
char data[0];
};
在結構中,data是一個數組名;但該數組沒有元素;該數組的真實地址緊隨結構體MyData以後,而這個地址就是結構體後面數據的地址(若是給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容);數組
這種聲明方法能夠巧妙的實現C語言裏的數組擴展。spa
實際用時採起這樣:操作系統
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str)).net
這樣就能夠經過p->data 來操做這個str。指針
示例:blog
#include <iostream>內存
using namespace std;get
struct MyData
{
int nLen;
char data[0];
};stringint 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個字節的空間。
提問:能不能這樣用Info a??? 若是以定義變量的形式定義Info a。會不會遇到a.data這個地址被佔用,而後再用致使不可預想的問題???????