c - 如何正确地将内存分配给存储在结构中的动态整数数组?

标签 c struct segmentation-fault malloc dynamic-arrays

我有一个将值设置为结构的函数:

我的结构:

struct entry {
    char key[MAX_KEY];
    int* values;
    size_t length;
    entry* next;
    entry* prev;
};

我的功能:

// Sets entry values
void command_set(char **commands, int arg_num) {
    struct entry e;
    e.length++;
    strcpy(e.key, commands[1]);
    for (int i = 2; i < arg_num; i++) {
        e.values[i - 2] = atoi(commands[i]);
    }
}

哪里:

  • **commands:是一个字符串数组
  • arg_num:就是数组中有多少个字符串
  • key:是条目的名字
  • 值:是存储在条目中的整数值

我运行代码并遇到段错误 11。我已将其缩小到以下行:

e.values[i -2] = atoi(commands[i]);

我假设我必须使用 malloc 来分配内存,因为我的循环似乎没有越界。我试图理解分配内存的正确方法,但是我似乎无法获得将 sizeof(int) 分配给动态整数数组的正确语法。

我试过:

e.values[i - 2] = malloc(sizeof(int));

e.values[i - 2] = (int) malloc(sizeof(int));

e.values[i - 2] = malloc(sizeof(int *));

但是我得到了错误:

incompatible pointer to integer conversion assigning
  to 'int' from 'void *' [-Werror,-Wint-conversion]

最佳答案

你必须分配整个数组:

e.values = malloc(sizeof(int) * (arg_num - 2))

重要提示:请记住在用完内存后调用 free,否则会发生内存泄漏。


不过您还有另一个问题,与您询问的问题无关。

你会

struct entry e;
e.length++;

当定义结构对象 e 时,它是未初始化,它的所有成员都将有一个不确定 值。以除初始化之外的任何方式使用此类未初始化的数据都将导致未定义的行为。当您执行 e.length++ 时,您确实使用了此类未初始化的值。

在您展示的代码中,这种增加根本没有任何意义。另一方面,该函数无论如何都没有多大意义,因为变量 e 及其所有数据将在函数返回时简单地“消失”。所以我只能假设这不是您向我们展示的完整功能。

要将结构初始化为全零,只需执行以下操作

struct entry e = { 0 };

关于c - 如何正确地将内存分配给存储在结构中的动态整数数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36638037/

相关文章:

c++ - Objective-C,CoreAudio : Possible reasons for which played sound has additional noise, 嘶嘶声和爆裂声?

c++ - 使用 openssl 检查 PKCS#7 中的根证书是否被撤销

可以从其他类调用的 C++ 多实例结构

c - 使用 printf 时出现段错误

c - C中文件操作中的段错误

c - 为什么这个递归代码会抛出段错误?

c - 与四元数的角度 - 使一个对象面向另一个对象

c - 如何在 C 中使用 fscanf 检查匹配失败

C++复制结构未解析的链接

php - 在PHP中如何检查类是否存在?