簡體   English   中英

結構體動態數組的初始化

[英]Initialization of dynamic array of structs

這是我的結構:

typedef struct ElementToInsert {
    char *key;
    char *value;
} element;

這是我的功能:

void init_hash(int size, element**arr) {
    *arr = malloc(size * sizeof(element*));
    if (arr == NULL)
    {
        printf("Out of memory\n");
        return 0;
    }
    for (int i = 0; i < size; i++) {

        (*arr)[i].key = NULL;
        (*arr)[i].value = NULL;
    }

}

main()

void main() {
    element *hash_table = NULL;
    int hash_table_size = 10;
    init_hash(hash_table_size, &hash_table);
}

問題是,當我運行調試器(在 Visual Studio 2015 中)時,它沒有顯示所有數組值。 我希望看到類似的東西: hash_table[0] = {key = NULL, value = NULL}, hash_table[1] = {key = NULL, value = NULL}但我看到的是:

在此處輸入圖片說明

將雙指針傳遞給init_hash是不必要的復雜。 雖然雙指針有很多有效的用途,但這不是其中之一。 通常雙指針用於多個輸出變量或換出現有內存,但由於您沒有返回值並且無論如何您都在分配內存,它只會引發錯誤。 保持簡單並返回指向元素列表的指針。

element *init_hash(size_t size) {
    element *hash = calloc(size, sizeof(element));

    if (hash == NULL) {
        fprintf(stderr, "Out of memory\n");
        exit(1);
    }

    return hash;
}

一些注意事項。 首先是分配一個結構數組,你分配size * sizeof(element) 這為size結構分配內存。 如果您使用size * sizeof(element*)指向 struct 的size指針分配內存。 兩者都是有效的,但您必須選擇要使用的那個。 您似乎正在使用結構列表。

malloc不同, calloc將為您清零內存。 這避免了手動將每個結構歸零的需要,從而節省了一些代碼和時間。

如果您的內存不足,並且您沒有計划來處理它,那么最好只為自己保存大量后續錯誤消息並exit

最后,尺寸最好存儲為size_t 這是 C 用於數組大小的類型,它可以捕獲一些類型問題。

暫無
暫無

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

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