char data[0]用法

摘自:http://www.javashuo.com/article/p-arysxjew-gk.html

 

以下結構: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];
};string

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個字節的空間。

 

提問:能不能這樣用Info a??? 若是以定義變量的形式定義Info a。會不會遇到a.data這個地址被佔用,而後再用致使不可預想的問題???????

相關文章
相關標籤/搜索