关于cin.get()和数组的小问题!!

来源:百度知道 编辑:UC知道 时间:2024/05/24 19:04:15
调试环境:vc++6.0
为什么
void main()
{
char c[30];
cin.get(c,33);
for(int i=0;c[i];i++)
cout<<c[i];
cout<<endl;

}
不出错?
返回32个数字
当cin.get(c,34)的时候就出错了

按照规定 c[30]里面只能有30个数字,从c[0]到c[29],写入c[30]时候已经出错,为什么一直写到c[32]都可以?
同理我做了测试,写入个数可以比数组大3,大4就会出错,这里有什么规定??我想问下
回1楼:char a[2], cin.get(c,32)出错

这源于数据对齐。所有分配的内存地址都会移动到32位边界上.

你声明了c[30]其实真正给予的是32个,后面两个供你后面的变量使用。

这也是大家通常把数组声名成16倍数的原因。最常见的如256、4096、65536。
其中4096是内存中的一页,进行大数据循环操作的时候通常用4096。

我的意思是给30字节的c读32个
那么后两个会跑到a里去,如果不成功可能是分配的内存不连贯.不用太计较.如果想尝试一下可以把c和a放到一个结构体中再试,那样a和c就连贯了。

如果你声明c[2]那么你可以多读30个

从1楼的回答中我认识到了很多东西,先谢谢1楼先
下面告诉下楼主我调试的认识
首先1楼回答的是正确的,就是确实是4字节内存对齐问题,也就是说你确实可以进行使用,但是由于这内存很明显不是你申明使用的,标准没有对此做任何规定,所以可能任何情况,比如我用char a[3]的使用只能多读2个,而且问题的出现并不是在代码的运行过程中出现的,而是后来的内存问题。