[英]Why declare a struct that only contains an array in C?
我遇到了一些包含以下內容的代碼:
struct ABC {
unsigned long array[MAX];
} abc;
什么時候使用這樣的聲明才有意義?
它允許您按值將數組傳遞給函數,或從函數中按值返回數組。
結構可以按值傳遞,這與在這些上下文中衰減為指針的數組不同。
另一個優點是它抽象了大小,因此您不必在代碼中聲明此類對象的任何地方都使用[MAX]
。 這也可以通過
typedef char ABC[MAX];
但是你有一個更大的問題:你必須意識到ABC
是一個數組類型(即使你在聲明類型ABC
變量時看不到這一點),否則你會被ABC
的事實刺痛在函數參數列表和變量聲明/定義中意味着不同的東西。
另一個優點是該結構允許您稍后根據需要添加更多元素,而無需重寫大量代碼。
您可以復制結構並從函數返回結構。
你不能用數組來做到這一點——除非它是結構的一部分!
你可以像這樣復制它。
struct ABC a, b;
........
a = b;
對於數組,您需要使用memcpy函數或循環來分配每個元素。
您可以使用 struct 來創建新類型的數據,例如string 。 你可以定義:
struct String {
char Char[MAX];
};
或者您可以創建一個數據列表,您可以通過函數參數使用它或在您的方法中返回它。 struct 比數組更靈活,因為它可以支持一些運算符,例如 = 並且您可以在其中定義一些方法。
希望對你有用:)
使用這樣的的另一個優點struct
是,它強制類型安全只要這樣的struct
被使用; 特別是如果您有兩種類型由用於不同目的的相同大小的數組組成,這些類型將幫助您避免意外地不恰當地使用數組。
如果你沒有在包裝一個數組struct
,你仍然可以聲明typedef
吧:這個有一定的優勢struct
- •類型聲明一次,•大小自動修正,•意圖的代碼變得更清晰, • 並且代碼更易於維護——但你失去了 ◦ 嚴格的類型安全性, ◦ 復制和返回類型值的能力,以及 ◦ 稍后添加成員而不破壞其余代碼的能力。 給定類型的裸數組的兩個typedef
僅在大小不同時產生不同的類型。 此外,如果您在函數參數中使用沒有*
的typedef
,則它等效於char *
,從而大大降低了類型安全性。
總之:
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char A_c_t[113]; // Partial type-safety, not assignable
A_s_t v_s(void); // Allowed
A_c_t v_c(void); // Forbidden
void s__v(A_s_t); // Type-safe, pass by value
void sP_v(A_s_t *); // Type-safe
void c__v(A_c_t); // UNSAFE, just means char * (GRRR!)
void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113
一個結構可以包含模擬 OOP 內存管理范例的一些優點的數組初始化、復制和 Fini 函數。 事實上,很容易擴展這個概念來編寫一個通用的內存管理實用程序(通過使用 sizeof() 結構來確切知道正在管理多少字節)來管理任何用戶定義的結構。 許多用 C 編寫的智能生產代碼庫大量使用這些,並且通常從不使用數組,除非它的范圍非常局部。
事實上,對於嵌入在結構中的數組,您可以隨時執行其他“智能操作”,例如在您想要訪問該數組時進行邊界檢查。 同樣,除非數組范圍非常有限,否則使用它並在程序之間傳遞信息是一個壞主意。 遲早,你會遇到讓你徹夜難眠並毀了你周末的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.