C语言三维char字符串数组访问:为何printf输出拼接字符串而非单个值
问题原因
- C 语言中字符串以
\0(空终止符)作为结束标记,printf的%s格式符会从传入的起始地址开始逐个读取字符,直到遇到\0才会停止输出。 - 你声明的三维数组为
char x[3][3][3],第三维的长度仅为3,但你用来初始化的每个字符串字面量(比如"bat")本身包含3个可见字符,外加编译器自动添加的\0,总存储长度为4字节。因此初始化时末尾的\0会被截断,所有字符串内容在内存中连续排列,没有分隔用的空终止符。 - 调用
printf("%s\n", x[1][0])时,起始地址对应"bat"的首地址,由于没有\0终止,读取操作会继续向后遍历内存中相邻的"cat"、"hat"、"hit"等内容,直到碰巧遇到内存中其他位置的\0才停止,最终就输出了拼接后的长字符串。
修复方法
- 方法一:调整数组第三维长度为4,预留空终止符的存储空间,将声明修改为
char x[3][3][4],此时每个字符串都有合法的结束标记,打印就能得到预期的"bat"。 - 方法二:如果确实需要保留第三维长度为3,打印时限制读取长度即可,将输出语句修改为
printf("%.3s\n", x[1][0]),限定最多读取3个字符,也能输出单个目标字符串。
内容的提问来源于stack exchange,提问作者cedlcc
相关产品推荐
相关产品推荐

