C语言char指针遍历:while用str != NULL替代*str != '\0'输出乱码原因求解
问题原理说明
你使用的两个循环条件判断的是完全不同的对象,逻辑差异极大:
*str != '\0':判断指针str当前指向的字符值是否为C字符串的结束标记'\0',这是遍历C风格字符串的正确终止条件,读到结束符时循环就会停止,不会出现越界访问。str != NULL:判断指针str本身存储的内存地址值是否为空地址(0地址)。你传入的字符数组首地址是合法的非空地址,每次执行str++只会把指针向高地址方向移动,地址值永远不会变成0,因此循环会无限执行,持续读取数组边界以外的未知内存内容,这些内存中的随机值输出后就会呈现为乱码,直到触发非法内存访问导致程序崩溃。
优化后的正确写法
如果需要同时兼容空指针传入的异常场景,可以增加防御性判断:
#include <stdio.h> void print(char* str) { // 先校验指针本身是否合法 if (str == NULL) { return; } // 再判断是否遍历到字符串结尾 while (*str != '\0') { printf("%c",*str); str++; } } int main() { char a[12] = "hello world"; print(a); return 0; }
内容的提问来源于stack exchange,提问作者S MEHDI M
相关产品推荐
相关产品推荐

