在結構體中定義char data 0 的用法

2021-08-08 08:16:47 字數 1516 閱讀 2268

struct mydata 

;

開始沒有理解紅色部分的內容,上網搜尋下,發現用處很大,記錄下來。

在結構中,data是乙個陣列名;但該陣列沒有元素;該陣列的真實位址緊隨結構體mydata之後,而這個位址就是結構體後面資料的位址(如果給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容);這種宣告方法可以巧妙的實現c語言裡的陣列擴充套件。

實際用時採取這樣:

struct mydata *p = (struct mydata *)malloc(sizeof(struct mydata )+strlen(str))
這樣就可以通過p->data 來操作這個str。

示例:

#include 

using

namespace

std;

struct mydata

;int main()

輸出:

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 

#include

#include

typedef

struct _info

info;

int main(int argc, char* argv)

程式的執行結果是:4。整數i就佔了4個位元組,這表明data沒有占用空間。data是乙個陣列名;該陣列沒有元素;該陣列的真實位址緊隨結構體info之後;這種宣告方法可以巧妙的實現c語言裡的陣列擴充套件。

記住上面的結構體不同於:

typedef

struct _info

info;

這個結構體占用8個位元組的空間,因為指標型別要占用4個位元組的空間。

再看乙個例子:

#include 

#include

#include

typedef

struct _info

info;

int main(int argc, char* argv)

程式的執行結果見下圖:

可知,data的位址是緊隨結構體之後的。

在結構體中定義巨集定義意義

第一次看見在結構體中有巨集定義,開始有點迷糊,想到該結構是如何儲存的?巨集定義會是不會多次編譯?以下是我看的乙個列子 typedef struct define xcp authorized bit 0x01 uint16 t xcpauthorizedbit 1 define block resp...

typedef在結構體定義中的使用

物件導向的語言接觸得多了,經常會忘記c語言中結構體變數宣告的特殊性,在這裡總結回顧一下。一 結構體在 中的兩種常見定義形式 1 結構體型別定義 struct a 定義 中的結構體為乙個名稱是 a 的結構體。使用這種定義方式時,必須使用struct a 來宣告變數,a 的宣告形式在c語言中是不被支援的...

定義在結構體裡面的巨集

測試 如下 include struct test void func define st define 20 int main int argc,char ar 輸出 1 10 20總結 1 巨集定義在結構體裡面,只是方便 的閱讀,一般這種情況,大部分是結構體裡面有標誌量,方便閱讀。2 在結構體裡...