《unix/linux程式設計實踐教程》中p69頁,有寫道,dirent結構中成員d_name用於存放檔名。注意在此系統中d_name被定義為只有乙個元素的陣列,這是如何做到的能?因為乙個自負的空間只能存放字串的結束字元。p92也詢問,在struct dirent中,陣列d_name的長度在有的系統上是1,而在有的系統上是是255。實際長度是多少?為什麼會有這些不同?
對此,我也一直十分困惑,直到看到《深度探索c++物件模型》p19才終於明白。
01
//比如:
02
struct
mumble
06
//是配合了下面的**的
07
//從檔案或標準輸入裝置中取得乙個字串
08
//然後為struct本身和該字串配置足夠記憶體
09
struct
mumble *pmumbl = (
struct
mumble*)
10
malloc
(
sizeof
(
struct
mumble) +
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...