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

