为啥程序:char x[4]={'a','b','c','d'}; char y[4]="efg";printf("%s",x);输出的结果却是abcdefg呢?

 我来答
jackwind1987
2013-03-22 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:483万
展开全部
C语言中的字符串有一个约定,即字符串的末尾用0来标识,所有处理字符串的函数都遵从这个约定,你的x数组,只有4个元素,而没有末尾的0,所以不会输出4个后自动停止,函数内部是不知道你传过去的参数是数组的,也不知道你要输出的字符的多少,只看末尾的0。为什么会输出efg是因为两点:一是xy的内存是连在一起的,所以d后面跟的是e,printf没看到0却看到了e,所以就输出e以及之后的几个字符,二是因为y是用双引号的方式初始化的,会自动在末尾加个0,所以efg后面是0,所以输出完g之后,看到了0,认为字符串结束。
mjtc901109
2013-03-22 · 超过22用户采纳过TA的回答
知道答主
回答量:112
采纳率:0%
帮助的人:81.3万
展开全部
我只能说这是一个巧合,你的输出就是有问题的,不能用%s来输出x,因为%s是输出字符串,只有当有‘\0’的时候才结束。而x[4]却没有‘\0’,你的代码在编译的时候刚好变量x和y的地址是连续的,所以一直输出,直到出现‘\0’也就是y[3]才停止输出!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
月生恋珊
2013-03-22 · TA获得超过582个赞
知道小有建树答主
回答量:160
采纳率:0%
帮助的人:44.6万
展开全部
printf 中%s输出 会从x[0]开始读字符 一直读到'\0'结尾
这里 你给x[4]赋值 a b c d
紧接着给 y赋值 内存地址可能临近 就会 接着读到 e f g 恰巧读到后面的'\0'
就会输出 abcdefg
但是 这不是绝对的 因为内存中 在x和y之间 也可能会有巧合 另一进程 占用里面的内存
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沧海雄风2009
2013-03-22 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2801万
展开全部
溢出了 x字符串没有结束符 \0

申请变量 存放顺序 后申请的放后面

输出顺序也一样

efg这种赋值方法后面有自动添加结束符

x y
a b c d e f g \0

因此输出x 就直接 一直输出到有结束符的这里的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式