#include<iostream>
using namespace std;
int main()
{
cout<<"Enter\n";
char ch[0];
cin>>ch;
cout<<sizeof ch;
cout<<sizeof &ch;
cout<<"\n You entered \n"<<ch<<"\n";
return 0;
}
我使用g ++编译器来编译C ++程序。 char ch
和char ch[0]
的内存分配有何不同? ch
可以接受一个字符,但ch[0]
可以接受多个字符(我输入qqqqqqqq)。为什么?另外,为什么sizeof ch
会返回0,而sizeof &ch
会返回4,但ch
会接受超过四个字符?
答案 0 :(得分:2)
让我们逐行:
char ch[0];
声明一个零长度的字符数组。正如评论中所提到的,C ++标准实际上并不允许这样做,但g ++可能会这样做。
cin >> ch;
将读入的内容放入零长度数组中。由于cin
不知道数组的长度(当它传递给流时它会衰减到char *
),它会尽可能多地写入,这意味着它可以存储多于零字符。
cout << sizeof ch;
输出数组的大小(即以字节为单位的总空间),如前所述,为零。
cout << sizeof &ch;
输出数组的地址的大小,在你的架构上是4个字节,因为它只是一个指针。
cout << "You entered\n" << ch << "\n";
输出存储在数组中的任何内容,这是没有明确定义的,因为正如我所提到的,零长度数组不是标准C ++。此外,由于cout
只是在遇到空字节(\0
)之前写入内存,因此它会尽可能多地写入您存储的内容,因为再次cout
并不关心您是否进行了删除ch
1}}大小为0
或大小为413
。
答案 1 :(得分:1)
char ch和char ch [0]的内存分配有什么不同。
不同之处在于编译器将保护您自己的程度。数组只是一个连续的内存块,C ++没有数组超出范围的异常,并且在写入之前不检查数组边界。使用
char ch[0];
你告诉C ++编译器你将负责边界检查。这是一个缓冲区溢出(记住那些)。当你将'qqqq'这样的东西分配给ch[0]
时,你已经覆盖了属于其他变量,函数或程序的其他内存。如果您需要更好的理解,请尝试运行以下程序。
// Note that I'm setting arr[10], which in Java (or any other modern language) would
// be an array out of bound exception
// I haven't run this program, but you're most likely to get 'a' printed
// to standard out
char arr[10], achar;
arr[10] = 'a';
cout << achar;