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

C语言中printf意外输出未指定数组的问题求助

为什么用printf("%s")打印无终止符的char数组会输出后续数组内容?

核心原因:printf("%s")的工作机制

printf的%s格式说明符要求传入的指针指向以'\0'(空字符)结尾的字符序列。它会从给定的起始地址开始,逐个输出内存中的字符,直到遇到第一个'\0'才停止输出。

你的testArray1定义为char testArray1[] = { 'a','b','c'};,没有显式添加终止符'\0',所以printf("%s", testArray1)会越过testArray1的内存边界,继续读取后续内存中的内容,直到找到某个'\0'为止。

从你的运行结果来看,编译器在内存中把testArray1和testArray2安排在了相邻位置(testArray2紧跟在testArray1之后),所以printf读完testArray1的a、b、c后,继续读取testArray2的q、w、e、r,直到遇到testArray2末尾的'\0'才停止,最终输出abcqwer。

重要提醒:这是未定义行为

这种跨数组边界读取内存的操作属于C语言中的未定义行为——不同编译器、编译选项或运行环境下,内存布局可能完全不同,结果也不可预测:可能输出乱码、程序崩溃,或者出现其他奇怪的现象。你这次只是刚好遇到了两个数组内存相邻的情况,才得到了看似“有规律”的输出。

正确的做法

如果要使用%s打印字符数组,必须确保数组以'\0'结尾,有两种简单的实现方式:

  • 显式添加终止符:
    char testArray1[] = { 'a','b','c','\0'};
    
  • 使用字符串字面量初始化(编译器会自动在末尾添加'\0'):
    char testArray1[] = "abc";
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:15:56