簡體   English   中英

有沒有一種快速的方法來檢查初始化結構中的所有屬性是否都未初始化?

[英]Is there a fast way to check if all attributes inside an initialized struct are uninitialized?

考慮以下結構:

typedef struct {
    int id;
    int *key;
    char *message;
    char ret;
} some_type;

在我的代碼中,我現在擁有:

some_type *a = (some_type *) malloc(sizeof(some_type));

我初始化了結構,但還沒有初始化它的屬性。 有沒有一種簡單的方法來檢索這種信息? 我想要一個 function 如果初始化結構的所有屬性都未初始化,這給了我真的。

編輯:我這樣做是因為我想在我的程序的getopt中實現特定功能。 用戶通過命令行傳遞的 Arguments 收集在此結構中。 如果除了“-h”之外沒有 arguments 通過,我想打印一個幫助部分。 因此,我認為我可以使用這樣的 function 來檢查我的結構中是否沒有初始化任何其他內容。 如果這是不可能的,其他人可以想出一個捷徑來實現我的目標嗎?

當我對在放射性環境中工作的 uC 進行編程時,我對每個數據結構都使用了 CRC。 使用calloc,添加CRC,數據出錯的概率會最小化

編輯

struct data {
    uint8_t a;
};

typedef struct
{
    struct data d;
    uint8_t _padding[4 * (sizeof(struct data) & 3) - (sizeof(struct data) & 3)];
    uint32_t CRC;
} __attribute__((packed)) data1;

首先,我們將有一些類型的重復,因此刪除無端且有害的類型:

some_type *a = (some_type *) malloc(sizeof(some_type));

變成:

some_type *a = malloc(sizeof *a);

現在,沒有辦法“探測”特定/所有成員是否已初始化,但您至少可以通過為您的結構分配一個已初始化的結構來確保未顯式初始化的所有內容都獲得默認初始化:

*a = (some_type){ .id = x, .key = y }; // message and ret have default initializers

這並不像你想要的那么好,但總比沒有好。

如果您不只是想幫助發現對未初始化數據的錯誤使用,但實際上長期需要了解有效性狀態,那么 dbush 的答案就是為您准備的。 您需要一個單獨的成員來指示可選成員的有效性標志,或者您需要將其解釋為“缺少任何值”的標記值(如 null 指針、負整數等),並且您需要設置它們(其中需要單獨執行每個操作,而 boolean 標志可以與我上面的默認初始化方法一起使用)。

通常,無法知道變量是否已初始化。 對於 malloc 返回的malloc ,所有 memory 都未初始化。

您需要通過分配一些已知的默認值或單獨的標志變量來自己跟蹤它。

關於傳遞給程序的命令行 arguments,它們每個都應該有一個默認值。 然后,如果特定的 arguments 包含默認值,那么您可以顯示您的幫助消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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