You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:37:26