關於C語言struct的特殊擴充套件技巧

2021-09-23 19:56:17 字數 1060 閱讀 9297

《unix/linux程式設計實踐教程》中p69頁,有寫道,dirent結構中成員d_name用於存放檔名。注意在此系統中d_name被定義為只有乙個元素的陣列,這是如何做到的能?因為乙個自負的空間只能存放字串的結束字元。p92也詢問,在struct dirent中,陣列d_name的長度在有的系統上是1,而在有的系統上是是255。實際長度是多少?為什麼會有這些不同?

對此,我也一直十分困惑,直到看到《深度探索c++物件模型》p19才終於明白。

01//比如:

02structmumble

06//是配合了下面的**的

07//從檔案或標準輸入裝置中取得乙個字串

08//然後為struct本身和該字串配置足夠記憶體

09structmumble *pmumbl = (structmumble*)

10malloc(sizeof(structmumble) +strlen(string) +1);

到這裡,應該已經很清楚了,這個c語言的技巧關鍵在於這個陣列位於struct末尾,於是配合malloc實現可變陣列。事實上對於struct是越界的,只是申請記憶體時考慮了越界的容量。

特別注意:這種技巧只存在於c語言的struct中,如果是c++的class,特別是派生類定義了virtual functions等,可能能順利轉化,也可能不行。所以c++中應該避免這種技巧,使用stl的vector等庫實現可變陣列。

c語言struct要點

struct struct name c 裡面struct和class是基本上一樣的 似乎預設的成員乙個是public乙個是private 並且c 在宣告乙個class struct後可以直接用classname structname來宣告例項 struct class tempname tempn...

C 語言和C 語言的 struct對比

c 語言和c 語言的 struct對比 author stonehat 1.c 語言將struct當成類來處理的,所以c 的struct可以包含c 類的所有東西,例如建構函式,析構函式,友元等,c 的struct和c 類唯一不同就是 struct成員預設的是public,c 預設private。而c...

C 語言中 struct 的陷阱

假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...