realloc未正确重分配内存:C语言动态字符串追加字符出错排查
嘿,刚从Python转C确实会碰到不少内存管理的坑,我来帮你捋捋这段代码里的几个关键问题:
问题1:指针传值导致主函数指针未更新
C语言里函数参数是传值传递,你在append_to里把array赋值为new_array,但这个修改只在函数内部有效,主函数里的list指针根本没变化。当realloc移动了内存地址后,主函数的list还指向原来的旧地址,这就会导致后续操作访问无效内存,到第25次迭代时就彻底出问题了。
解决方法:把参数改成指针的指针(char **array),这样就能在函数里修改主函数的指针了。调整后的函数参数和调用方式如下:
// 修改函数定义 void append_to(char **array, char value) { // 后续代码里的array要改成*array来访问实际指针 } // 主函数里调用 append_to(&list, 'a');
问题2:初始内存未初始化,strlen行为未定义
你一开始用malloc(sizeof(char))分配了1字节,但这块内存里的内容是随机垃圾值,strlen(array)会一直扫描内存直到碰到'\0',这会导致realloc的大小计算完全错误,甚至可能触发越界访问。
解决方法:初始化的时候直接把内存设为空字符串:
char *list = malloc(sizeof(char)); *list = '\0'; // 初始化空字符串,让strlen能正确识别长度为0
问题3:追加字符后未添加字符串结束符
'\0' C语言的字符串必须以'\0'结尾,你在array[position] = value;之后没有添加array[position + 1] = '\0';,这样strlen和printf都无法正确识别字符串的结尾,输出就会出现乱码或者空内容的情况。
修正后的完整代码
把这些问题都修复后,代码就能正常运行了:
#include <stdio.h> #include <stdlib.h> #include <string.h> void append_to(char **array, char value) { size_t current_len = strlen(*array); // 新的大小:当前长度 + 1个新字符 + 1个结束符 size_t buffer = current_len + 2; char *new_array = realloc(*array, buffer); if (new_array == NULL) { printf("CRITICAL ERROR\n"); exit(-1); } *array = new_array; (*array)[current_len] = value; (*array)[current_len + 1] = '\0'; // 必须添加字符串结束符 } int main() { char *list = malloc(sizeof(char)); *list = '\0'; // 初始化为空字符串 for (int i = 1; i < 26; i++){ append_to(&list, 'a'); printf("%d -> %s\n", i, list); } free(list); // 别忘了释放内存,C语言没有自动垃圾回收! return 0; }
内容的提问来源于stack exchange,提问作者Arthur Zopellaro
相关产品推荐
相关产品推荐

