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

时间:2016-04-15 04:01:49

标签: 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]);
    }
}

其中:

  • **命令:是一个字符串数组
  • arg_num:数组中有多少个字符串
  • key:是条目的名称
  • values:是条目
  • 中存储的整数值

我运行代码并且出现了分段错误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]

3 个答案:

答案 0 :(得分:4)

您必须分配整个数组:

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

重要提示: 请记住在完成内存操作后致电free,否则会导致内存泄漏。

你有另一个问题,与你提出的问题无关。

你做

struct entry e;
e.length++;

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

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

要将结构初始化为全零,只需执行

struct entry e = { 0 };

答案 1 :(得分:2)

因为你的结构如下

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

然后你应该为它分配内存

e.values =(int *)malloc(arg_num*sizeof(int));

如果您有10个值,那么您将为其分配10 * 4个值。 并免费调用

free(e.values)

当e或e.values不再有用时。有关详细信息,您可以see here

答案 2 :(得分:1)

修改功能如下。

void command_set(char **commands, int arg_num) {
    struct entry e;
    e.length++;
    strcpy(e.key, commands[1]);
    //here is the memory allocation
    e.values = malloc(arg_num-1 * sizeof(int));
    for (int i = 0; i < arg_num-1; i++) {
        e.values[i] = atoi(commands[i+1]);
    }
}