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

C语言代码输出异常,疑为空字符('\0')终止问题求排查解决

问题分析与修复方案

你的代码存在三个核心问题,直接导致输出异常:

1. 内存分配不足引发越界

malloc(4)仅分配4字节内存,但字符串"aaab"实际需要5字节空间(4个可见字符+1个字符串终止符'\0')。strcpy会强制把包含'\0'的所有内容拷贝进去,超出分配的内存范围,破坏堆区其他数据,触发未定义行为。

2. 未初始化指针非法写入

char *pt;声明的指针未初始化,指向内存中随机的未知地址。strcpy(pt, str)会把字符串内容写入这个随机地址,直接破坏系统或程序的内存区域,导致程序行为完全不可控。

3. 循环终止条件错误

while(pt != NULL)的判断逻辑完全错误。字符串的结束标志是字符'\0',正确的判断应该是*pt != '\0'。原条件会让指针一直向后移动,读取内存中所有随机垃圾数据,直到恰好遇到NULL地址(几乎不可能),所以会输出大量异常内容。


修复后的代码

方案一:直接复用原字符串指针

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    // 分配足够容纳"aaab"+'\0'的5字节内存
    char *str = (char*)malloc(5);
    // 检查内存分配是否成功(必要的健壮性判断)
    if(str == NULL){
        perror("malloc failed");
        return 1;
    }
    strcpy(str,"aaab");

    // 让pt直接指向str的起始地址,无需额外拷贝
    char *pt = str;

    // 正确判断字符串终止符
    while(*pt != '\0'){
        printf("%c",*pt);
        pt++;
    }
    // 释放分配的内存,避免内存泄漏
    free(str);
    return 0;
}

方案二:独立拷贝字符串到新指针

如果确实需要将字符串拷贝到新指针使用,需为pt分配足够内存:

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char *str = (char*)malloc(5);
    if(str == NULL){
        perror("malloc failed");
        return 1;
    }
    strcpy(str,"aaab");

    // 为pt分配与str等长的内存(strlen(str)获取有效字符长度,+1用于存放'\0')
    char *pt = (char*)malloc(strlen(str)+1);
    if(pt == NULL){
        perror("malloc for pt failed");
        free(str);
        return 1;
    }
    strcpy(pt,str);

    while(*pt != '\0'){
        printf("%c",*pt);
        pt++;
    }
    // 依次释放分配的内存
    free(pt);
    free(str);
    return 0;
}

内容的提问来源于stack exchange,提问作者Kiyotaka Ayanakoji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:42:56