繁体   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