c - 动态结构数组的初始化

标签 c arrays struct

这是我的结构:

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} 但我看到的只是这样:

enter image description here

最佳答案

将双指针传递给 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*)size 指向结构体的指针分配内存。两者都有效,但您必须选择要使用哪一个。您似乎正在使用结构列表。

malloc不同,calloc将为你清零内存。这避免了手动将每个结构清零的需要,从而节省了一些代码和时间。

如果您的内存不足,并且没有计划来处理它,那么最好的方法可能是保存大量后续错误消息并退出

最后,尺寸最好存储为 size_t。这是 C 用于数组大小的类型,它可以捕获一些类型问题。

关于c - 动态结构数组的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41685424/

相关文章:

c - 为什么用不同的方式修改字符串会有不同的行为?

c - 嵌套循环错误

c - C 中简单包装函数的用途

PHP在foreach中显示多维数组的结果

c# - 将一个数组拆分为两个并行数组或在 C# 中直接读入两个数组

c++ - 打印结构对象的地址

c - C中的链表结构与读取txt

c - 如何用C语言替换txt文件中的单词?

java - 如何将数组从一个 Servlet 传递到另一个 Servlet?

c - 从结构体指针添加 int