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

C语言数组中字符串读取异常问题咨询,求逐行解释程序运行逻辑

问题原因说明

核心原因是C语言中数组初始化时未显式赋值的元素会被自动初始化为0(对应char类型就是'\0'),这就是你最后一行printf没有输出的根本原因。

逐行运行过程解析
  • char array[100] = {'a', 'b', 'c', '\0'};
    你定义了长度为100的char数组,显式给前4个下标(0-3)赋值为'a'、'b'、'c'、'\0'。C标准明确规定:当数组初始化列表长度小于数组总长度时,剩余所有元素会被自动初始化为0值,所以array[4]到array[99]初始值全都是'\0'。
  • array[98] = 'x';
    手动把下标98的元素从初始的'\0'改为'x',其余元素保持初始化状态不变。
  • char *p, *q;
    声明两个char类型的指针变量。
  • p = array;
    数组名array默认代表数组首元素地址,这里把p指向array[0]的地址。
  • printf("%s", p);
    %s格式符从p指向的地址开始打印字符,直到遇到'\0'停止:依次打印'a'、'b'、'c',到array[3]的'\0'停止,输出abc。
  • printf("%s", (p + 2));
    p+2等价于&array[2],从下标2开始打印:先打印'c',到array[3]的'\0'停止,输出c。前面两次输出拼接起来就是abcc,和你看到的前半部分结果一致。
  • q = &array[5];
    q指向数组下标5的地址,前面已经说明array[4]到array[97]初始值全是'\0',所以q指向的位置存储的就是'\0'。
  • printf("%s", q);
    从q指向的位置开始打印,第一个字符就是'\0',直接停止打印,所以没有任何内容输出。
补充说明

你预想的'x'没有输出,是因为你误以为array[5]到array[97]之间没有'\0',但实际上这些位置全是初始的'\0',打印逻辑在最开头就停止了,根本不会走到下标98的'x'位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:45:07