C语言中malloc分配内存后调用free报错,求错误原因分析
代码错误原因分析
核心错误:堆内存越界写入导致free崩溃
你的代码中function函数里的这一行是致命问题:
string[-1] = '\0';
malloc返回的指针string是分配内存块的起始地址,合法访问范围是string[0]到string[string1_length + string2_length](因为你分配了string1_length+string2_length+1个char,索引从0开始)。string[-1]等价于*(string - 1),这是访问了分配内存块之外的地址,属于非法越界写入,会破坏堆管理器维护的内存块元数据(比如内存块大小、前后块链表指针等)。- 当后续调用
free(string)时,堆管理器无法正确解析被破坏的元数据,直接触发程序崩溃,因此free之后的printf语句根本没有机会执行。
额外修正说明
字符串的终止符'\0'应该放在合法内存范围的最后一个位置,也就是:
string[string1_length + string2_length] = '\0';
而不是写到越界的位置。
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

