关于C语言中puts函数的问题

weixin_45906870 2020-01-12 08:41:27
#include <stdio.h>

int main()
{
char side_a[] = "Side A";
char dont[] = {'W','O','W','!'};
char side_b[] = "Side B";

puts(dont); /*dont 不是一个字符串*/

return 0;
}

为什么这个代码输出是——WOW!Side A?
Side A怎么跑后面去了?
...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_45906870 2020-01-12
  • 打赏
  • 举报
回复
十分感谢
寻开心 2020-01-12
  • 打赏
  • 举报
回复
局部变量的之间的地址关系,c/c++标准没有定义, 是编译器自己的行为, 不能把你发现的结果作为所有的编译器通用行为
它只对你所有的编译器和所在的系统环境有效,换一个不一定对
寻开心 2020-01-12
  • 打赏
  • 举报
回复
printf("%p : %p %p", sida_a, dont, side_b); 你看看三个指针,他们的关系,到底哪一个地址高,哪个一个地址低

函数里面的局部变量,都是栈内存, 在你用的这个编译器里面,地址向下增长的.
weixin_45906870 2020-01-12
  • 打赏
  • 举报
回复
那它为什么不跑到side_b而非要跑side_a那里去呢?
寻开心 2020-01-12
  • 打赏
  • 举报
回复
就是把字符数组当字符串使用的时候, 必须在数组里面,人工的填写一个'\0'字符放到最后,即:
char dont[] = {'W','O','W','!' ,'\0'};

而 char side_a[] = "Side A"; 这种定义,因为字符串自带'\0'字符在尾巴,就无需人工补这个0字符了
寻开心 2020-01-12
  • 打赏
  • 举报
回复
因为它是数组, 里面没有一个 ‘\0’这样的一个值
把它当做字符串输出的时候, puts会在数组里面一直输出,直到遇到了'\0'字符为止
显然,在输出的过程当中越界了, 跑到了side_a数组里面还在继续输出,直到遇到了“Side A”这个字符串结尾的'\0'字符才结束

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧