1. 程式人生 > >結構體中Char a[0]用法——柔性陣列

結構體中Char a[0]用法——柔性陣列

有如下定義:
typedef struct{ 
char a; 
char b[0]; 
}; 
其中元素Char b[0];叫做柔性陣列,主要用於使結構體包含可變長欄位。詳細內容如下:
柔性陣列; 
【柔性陣列結構成員 
  C99中,結構中的最後一個元素允許是未知大小的陣列,這就叫做柔性陣列成員,但結構中的柔性陣列成員前面必須至少一個其他成員。柔性陣列成員允許結構中包含一個大小可變的陣列。sizeof返回的這種結構大小不包括柔性陣列的記憶體。包含柔性陣列成員的結構用malloc ()函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小,以適應柔性陣列的預期大小。】 
C語言大全,“柔性陣列成員” 
看看 C99 標準中 靈活陣列成員: 

結構體變長的妙用——0個元素的陣列 
有時我們需要產生一個結構體,實現了一種可變長度的結構。如何來實現呢? 
看這個結構體的定義: 
typedef struct st_type 

int nCnt; 
int item[0]; 
}type_a; 
(有些編譯器會報錯無法編譯可以改成:) 
typedef struct st_type 

int nCnt; 
int item[]; 
}type_a; 
這樣我們就可以定義一個可變長的結構,用sizeof(type_a)得到的只有4,就是sizeof(nCnt)=sizeof(int)那個0個元素的陣列沒有佔用空間,而後我們可以進行變長操作了。 
C語言版: 
type_a *p = (type_a*)malloc(sizeof(type_a) 100*sizeof(int)); 

C++ 語言版: 
type_a *p = (type_a*)new char[sizeof(type_a) 100*sizeof(int)]; 
這樣我們就產生了一個長為100的type_a型別的東西用p->item[n]就能簡單地訪問可變長元素,原理十分簡單 ,分配了比sizeof(type_a)多的記憶體後int item[];就有了其意義了,它指向的是int nCnt;後面的內容,是沒有記憶體需要的,而在分配時多分配的記憶體就可以由其來操控,是個十分好用的技巧。 
而釋放同樣簡單: 
C語言版: 
free(p); 
C++ 語言版: 
delete []p; 
其實這個叫靈活陣列成員(fleible array member)C89不支援這種東西,C99把它作為一種特例加入了標準。但是,C99所支援的是incomplete type,而不是zero array,形同int item[0];這種形式是非法的,C99支援的形式是形同int item[];只不過有些編譯器把int item[0];作為非標準擴充套件來支援,而且在C99釋出之前已經有了這種非標準擴充套件了,C99釋出之後,有些編譯器把兩者合而為一。 

//////////////////////////////////////////////////////// 
下面看看這樣做的用處 
Typedef struct{ 
Char a[1]; 
Char b[]; 
}AA; 
AA *pf; 
pf = malloc(sizeof(AA) 5*sizeof(char));/*只分配一塊記憶體*/ 
如果這樣定義 
Typedef struct{ 
Char a[1]; 
Char *b; 
}AA; 
AA *pf; 
pf = malloc(sizeof(AA)); 
pf->b = malloc(5*sizeof(char));/*看出來了麼,這樣需要分配兩塊記憶體,在釋放時也要先釋放b的記憶體,再釋放pf的記憶體*/ 

相關推薦

結構Char a[0]用法——柔性陣列

有如下定義:typedef struct{ char a; char b[0]; }; 其中元素Char b[0];叫做柔性陣列,主要用於使結構體包含可變長欄位。詳細內容如下:柔性陣列; 【柔性陣列結構成員   C99中,結構中的最後一個元素允許是未知大小的陣列,這就叫做柔

c結構char[0]的作用

struct MyData {    int nLen;    char data[0];};          開始沒有理解紅色部分的內容,上網搜尋下,發現用處很大,記錄下來。 在結構中,data

C語言結構冒號(位域)用法

位域出現的原因是由於某些資訊的儲存表示只需要幾個bit位就可以表示而不需要一個完整的位元組,同時也是為了節省儲存空間和方便處理。   typedef struct  bit_struct {     int &n

c語言結構的冒號的用法

其中 bsp 位段 定義 main 一位 輸出 格式 data 結構體中常見的冒號的用法是表示位域。 有些信息在存儲時,並不需要占用一個完整的字節,而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1兩種狀態,用一位二進位即可。為了節省存儲空間,並使處理簡便,C

c結構柔性陣列

開發C程式碼時,經常見到如下型別的結構體定義: 1 2 3 4 5 typedef struct list_t{ struct list_t *next; struct list_t *prev; char data[0]; }l

簡述一下二級指標以及指標的引用在結構用法

我一下討論的都是在不用return把值進行返回的情況, 也就是說用指標的情況。 很簡單就是指標和引用,引用在新版本的c裡面也有包含,可以使用。 系統xp+ide用的 vc6.0: 要把一個值通過呼叫函式改變,可以用指標和引用,這個值可以是int int *,char

C 語言變長陣列 struct char data[0] 的用法

1、結構體記憶體佈局(padding) 為了讓CPU能夠更舒服地訪問到變數,struct中的各成員變數的儲存地址有一套對齊的機制。這個機制概括起來有兩點:第一,每個成員變數的首地址,必須是它的型別的對齊值的整數倍,如果不滿足,它與前一個成員變數之間要填充(paddin

在C語言結構添加成員函數

我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

c語言的特殊符號(結構

結合 特殊 value -s height 間接尋址 出現 span size  在“結構”中出現的->運算符成為“右箭頭選擇”,可以用new_node->value = 10;來代替(*new_code).value = 10;即運算符->是運算符*和運

golang 結構的匿名接口

imp -i pil win CA git Go mean others golang 結構體中的匿名接口 代碼示例 golang 中,可以給結構體增加匿名field,可參考 unknwon 大神的書。 匿名字段和內嵌結構體 但,golang同時也可以給結構體定義一個匿名i

C語言中free()函數釋放struct結構的規律

void poi inf clu main 圖片 刪除 動態分配 不同 並不是什麽新鮮的事情,不過值得註意。首先我們知道,在使用struct來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)這一塊連續空間

OpencvMat結構元素的獲取與賦值

【OpenCV3影象處理】Mat中元素的獲取與賦值 ( 對比.at<>()函式 和 .ptr<>()函式) 2017年04月12日 10:08:55 閱讀數:7542 標籤: opencvopencv3 更多 個人分類:&nbs

結構運算子的過載

C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。 比如二分查詢,binary_crearch只能對陣列進行查詢,如果是結構

C++組合(聚合)與C結構包含函式

C++組合(聚合)與C結構體中包含函式 今天突然想到C++的聚合,以前一直沒有注意,今天想到就寫下來,做個筆記; C++的類與我們的C語言中的結構體特別像,但是有有些不太一樣,這裡不多累贅了不能,大家學過的都知道。 C++組合(聚合) 我們知道的都是C++的類的物件,

結構的指標,用malloc初始化時,沒有分配足夠的記憶體空間,造成下述錯誤

      對結構體中的指標,初始化和釋放,遇到堆損壞問題(附連結點選開啟連結)點選開啟連結) out_defect.texturing = (TEXTURING *)malloc(sizeof(TEXTURING

結構使用函式指標

 struct kobj _ type  {  void (*release)(struct kobject *);  struct sysfs _ ops * sysfs _ ops;  struct attribute ** default _

C++:對結構字元陣列賦值時,出現表示式必須是可修改的左值的問題

問題描述:         在C++中為結構體中的字元陣列賦值時,出現”表示式必須是可修改的左值“的錯誤提醒,編譯報錯“不可指定資料型別”。           &n

結構定義變數時,出現冒號+數字的形式(位域定義)

該種形式出現於結構體或共用體的定義中,是位域定義的標準形式。其使用方式為struct name{type var_name : n;};含義為,在結構體name彙總,成員變數var_name佔用空間為n位。n為正整數,其值必須小於type型別佔用的位數。比如type如果是int,佔4位元組32位,那麼n必須是

PE檔案可選頭結構的校驗和

Windows作業系統中的驅動和一些系統dll檔案都是有校驗和的,而且Windows系統在載入時實惠檢查校驗和有沒有發生變化,發生變化,說明檔案已經被修改過(沒有變化,檔案可能沒有修改過;也可能檔案修改後,重新計算了校驗和,填寫到指定位置)肯定不會繼續載入。CheckSumMappedFile( )

結構的位欄位

z指定的位數決定了結構體變數d的大小,當z:29時,佔用4個位元組,共32位;當z:32時,需要使用8個位元組,佔用35位,自動補齊。一個int型佔用4個位元組。 #include <iostream> #include <stdio.h> usi