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

字符数组printf输出异常:为何两次printf结果不一致?

代码两次printf输出不一致,前两项乱码的原因

注:instrct_content数组仅存储"main"、"lab1"、"lab2"、"lab3"、"lab4"和"lab5"字符串

char** instrct_content = (char**)malloc(sizeof(char)); 

while(scanf("%s", str) != EOF){ 
    if (strrchr(str, ':') != NULL){
        instrct_content = (char**)realloc(instrct_content, sizeof(char));
        instrct_content[instrct_cnt] = (char*)malloc(sizeof(char));
        instrct_content[instrct_cnt] = strcpy(instrct_content[instrct_cnt], str);
        printf("%s ", instrct_content[instrct_cnt]); // (1)
        instrct_cnt +=1;
            
  }

for (int i=0; i<instrct_cnt; i++){ 
    printf("%s ", instrct_content[i]); // (2) 
}

问题现象

代码中(1)处的printf能正确输出目标字符串(如main: lab1: lab2: lab3: lab4: lab5:),但(2)处的printf输出结果前两项出现乱码(如�gM �gM lab2: lab3: lab4: lab5:)。

异常原因分析

出现乱码的核心原因是多次内存分配的尺寸完全错误,导致内存越界和堆结构破坏,具体问题点如下:

  • 指针数组的内存分配错误:instrct_content是char**类型的指针数组,每个元素是占4/8字节的char*指针,但初始化和每次realloc时都只分配1字节空间,完全存不下指针数据。随着元素增加,内存不断溢出,后续写入的指针会覆盖之前的有效数据,破坏堆管理结构,导致后续访问时出现无效地址。
  • 字符串内存分配错误:为每个字符串分配内存时仅申请1字节,远小于目标字符串的长度,执行strcpy时会越界写入,直接覆盖堆中其他区域的数据(包括instrct_content里的指针)。虽然(1)处能临时正确输出,但后续的内存操作会进一步破坏堆结构,导致(2)处访问前两项时,指针已被篡改,指向无效内存区域,最终输出乱码。

内容的提问来源于stack exchange,提问作者Dohye Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:22:11