为啥程序:char x[4]={'a','b','c','d'}; char y[4]="efg";printf("%s",x);输出的结果却是abcdefg呢?
展开全部
C语言中的字符串有一个约定,即字符串的末尾用0来标识,所有处理字符串的函数都遵从这个约定,你的x数组,只有4个元素,而没有末尾的0,所以不会输出4个后自动停止,函数内部是不知道你传过去的参数是数组的,也不知道你要输出的字符的多少,只看末尾的0。为什么会输出efg是因为两点:一是xy的内存是连在一起的,所以d后面跟的是e,printf没看到0却看到了e,所以就输出e以及之后的几个字符,二是因为y是用双引号的方式初始化的,会自动在末尾加个0,所以efg后面是0,所以输出完g之后,看到了0,认为字符串结束。
展开全部
我只能说这是一个巧合,你的输出就是有问题的,不能用%s来输出x,因为%s是输出字符串,只有当有‘\0’的时候才结束。而x[4]却没有‘\0’,你的代码在编译的时候刚好变量x和y的地址是连续的,所以一直输出,直到出现‘\0’也就是y[3]才停止输出!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
printf 中%s输出 会从x[0]开始读字符 一直读到'\0'结尾
这里 你给x[4]赋值 a b c d
紧接着给 y赋值 内存地址可能临近 就会 接着读到 e f g 恰巧读到后面的'\0'
就会输出 abcdefg
但是 这不是绝对的 因为内存中 在x和y之间 也可能会有巧合 另一进程 占用里面的内存
这里 你给x[4]赋值 a b c d
紧接着给 y赋值 内存地址可能临近 就会 接着读到 e f g 恰巧读到后面的'\0'
就会输出 abcdefg
但是 这不是绝对的 因为内存中 在x和y之间 也可能会有巧合 另一进程 占用里面的内存
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
溢出了 x字符串没有结束符 \0
申请变量 存放顺序 后申请的放后面
输出顺序也一样
efg这种赋值方法后面有自动添加结束符
x y
a b c d e f g \0
因此输出x 就直接 一直输出到有结束符的这里的
申请变量 存放顺序 后申请的放后面
输出顺序也一样
efg这种赋值方法后面有自动添加结束符
x y
a b c d e f g \0
因此输出x 就直接 一直输出到有结束符的这里的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询