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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:48:06