結構體中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來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)這一塊連續空間
Opencv中Mat結構體中元素的獲取與賦值
【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