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
相关产品推荐
相关产品推荐

