2 awdszxtanwei awdszxtanwei 于 2016.09.07 10:08 提问

c++中的cin>>和数组问题

代码如下:
#include
using namespace std;
int main()
{
char str1[10],str2[10];
cin >> str1;
cin >> str2;
cout << str1 << endl;
cout << str2 << endl;
cout << str1[11] <<endl;
return 0;
}

使用g++进行编译,终端输入输出如下:
测试一:
输入:
zesbstyjhgfmkdy
szzzzzzb
输出:
zesbstyjhgfmkdy
szzzzzzb
m
通过回车结束输入,此处因为数组越界,所以正常。

测试二:
输入:
awrsfdehgqpothfgj
asdhf
输出:
awrsfdehgqpothfgasdhf
asdhf
o
为什么当输入第一行字符个数大于16个时,输出会将第一行截断再把第二行接上?

3个回答

skaitiaozhan
skaitiaozhan   2016.09.07 10:25

你不是都数组越界了么。跟你的栈内存有关。
测试一内存情况是
str1 10 byte + 中间不知多少字节内存 + str2 10 byte

测试二内存情况是
str1 10 byte + 6字节 + str2 10 byte。
你可以看到str1输出的时候str2的第一个字节覆盖掉了输入最末尾的j。这意味着读到了str2的内存了。至于截断,只是碰到了\0而已

awdszxtanwei
awdszxtanwei 我修改了一下程序如下:
大约一年之前 回复
awdszxtanwei
awdszxtanwei   2016.09.07 11:29

我修改了一下程序如下:
#include
using namespace std;
int main()
{
char str1[10],str2[10];
cin >> str1;
cin >> str2;
cout << str1 << endl;
cout << str2 << endl;
cout << &str1 << endl;
cout << &str2 << endl;
cout << str1[11] <<endl;
return 0;
}
输入:
aewysdhsdfkfskgsgigylsy
aajogasghash
输出:
aewysdhsdfkfskgsaajogasghash
aajogasghash
0x7fffbaedc010
0x7fffbaedc020
f
可以看出str1和str2的地址相差16字节,截断我懂了,只是为什么数组初始化分配内存为16个字节?

skaitiaozhan
skaitiaozhan   2016.09.09 14:02

[root@localhost tmp]# ./t
asdasdasdasdasdsadasd
asdasd
asdasdasdasdasdsadasd
asdasd
0xbfd91736
0xbfd9172c

这是我直接cp你的代码。跑的是win7上fedora23的虚拟机。
g++信息如下
目标:i686-redhat-linux
配置为:../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch=i686 --build=i686-redhat-linux
线程模型:posix
gcc 版本 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)

可以看到我跑出来的程序刚好相差10个字节。你要是去找为什么你的程序差了16个字节你只有去问编译器做了什么。编译器给你分配的地址,可能因为不同平台不同编译器不同环境甚至相同编译器不同版本而改变。这个是动态的你去寻找这个答案没有意义。如果你是去做编译器那块的以后研究了编译器倒可以跟我讲讲是怎么考虑分配地址的...

Csdn user default icon
上传中...
上传图片
插入图片