【发布时间】:2020-04-07 06:22:07
【问题描述】:
我正在尝试将结构中的字符串分配给另一个结构的字符串:
func->parameters[func->parameter_amount].name = tokens[i+1].value;
这发生在一个while循环中:
while (true) {
func->parameter_amount++;
func->parameters = realloc(func->parameters, func-> parameter_amount*sizeof(struct parameter));
if (func->parameters == NULL) {
mem_error();
}
if ((tokens[i].token != symbol) && (tokens[i].token != comma)) {
break;
} else if ((tokens[i].token == symbol) && tokens[i+1].token == symbol) {
func->parameters[func->parameter_amount].type = string_to_type(tokens[i].value);
if (func->parameters[func->parameter_amount].type == -1) {
printf("Error: Invalid type '%s' for parameter declaration in function '%s' on line %i\n", tokens[i].value, func->name, func->line);
exit(1);
}
func->parameters[func->parameter_amount].name = tokens[i+1].value;
i += 2;
} else if (tokens[i].token == comma) {
func->parameter_amount--;
i++;
}
}
分配发生后,程序说:
realloc(): invalid next size
并中止
结构定义为:
struct parameter {
int type;
char* name;
};
struct function {
int line;
int type;
char* name;
struct parameter* parameters;
int parameter_amount;
};
typedef struct {
int token;
char* value;
int line;
} token;
我不知道出了什么问题
【问题讨论】:
-
分配指针不会复制内存块。如果这指向动态分配的内存,则需要确保在不使用任何指针之前不会释放它。如果您不这样做,您将取消引用已释放的指针,并导致未定义的行为。
-
你应该使用
func->parameters[func->parameter_amount].name = strdup(tokens[i+1].value); -
我们真的需要minimal verifiable example,因为根本原因可能在也可能不在您显示的代码中。但这看起来很可疑:
func->parameters[func->parameter_amount]。func->parameter_amount设置的确切值是多少?如果它是参数的数量,那么最大数组索引将为parameter_amount-1。使用parameter_amount会导致缓冲区溢出。
标签: c data-structures memory-management realloc