我有一个将值设置为结构的函数:
我的结构:
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]
答案 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]);
}
}