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

How to correctly allocate memory to a dynamic array of integers stored in a struct?

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

我的结构:

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

其中:

我 运行 代码,我得到了一个分段错误 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++.

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

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

struct entry e = { 0 };

修改函数如下

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

因为你的结构如下

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

free(e.values)

当 e 或 e.values 不再有用时。如需更多信息,您可以 see here