关于字符数组。。。。(求助)

沉珂 2005-12-27 06:53:09
#include <stdio.h>
main()
{
char m[5];
gets(m);
puts(m);
}


输入6个字符,还是输出来,为什么?
如果是字符数组不一定要添加\o的话,
那么在puts时不是不能判断是不是字符串已经结束。。。。
寒,这个问题一直不懂,
问问。。。。
谢谢。。。



...全文
197 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
0黄瓜0 2005-12-27
  • 打赏
  • 举报
回复

2  内存的分配是以 字 (8 个字节)为单位的!!注意, 是字 !!
=======================================
一个字是4个字节,就是说char m[5];char m[6];char m[7];char m[8];都会分二个字长(8个字节),但char m[4];char m[3];只会分一个字长(4个字节)


输入 少于 8个字符时候,都可以正常输出。
如果多了 8 个,那么就 OVER吧 ~
===============================
正确。请运行:
#include <stdio.h>
main()
{
char m[5];
char n[5];
gets(m);
puts(m);
}



这个如果输入多了 4 个,那么就 OVER吧 ~

#include <stdio.h>
main()
{
char m[4];
char n[5];
gets(m);
puts(m);
}



jixingzhong 2005-12-27
  • 打赏
  • 举报
回复
1  gets()自动会在后面增加一个 \0 终结字符串
2  内存的分配是以 字 (8 个字节)为单位的!!注意, 是字 !!

所以有这样的情况:
输入 少于 8个字符时候,都可以正常输出。
如果多了 8 个,那么就 OVER吧 ~
jixingzhong 2005-12-27
  • 打赏
  • 举报
回复
简单 !!
有两个要点 :
flyelf 2005-12-27
  • 打赏
  • 举报
回复
这种情况下,就会给他人的溢出攻击提供了条件了
沉珂 2005-12-27
  • 打赏
  • 举报
回复
是不是这样:
gets的参数是指针,接收到字符串后就开始存在内存中,而不判断是不是还在数组的范围内,
通过指针++来实现存储,输入结束后自动加个\o,puts输出时,碰到\o结束输出。
whatsouta 2005-12-27
  • 打赏
  • 举报
回复
这是因为你输入进去后,从第4个字符开始以后的内存还没有被其他程序用到
tanq 2005-12-27
  • 打赏
  • 举报
回复
就是不做越界检查啊,这里很多人都说了!

表面是正确的,其实程序是错误的

69,382

社区成员

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

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