我有一个将值设置为结构的函数:
我的结构:
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/