簡體   English   中英

為什么在 C 中聲明一個只包含數組的結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM