0
#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接受超过四个字符?

4

2 回答 2

2

让我们逐行看:

char ch[0];

声明一个长度为零的字符数组。正如评论中提到的,C++ 标准实际上不允许这样做,但 g++ 可能。

cin >> ch;

将读入的内容放入零长度数组中。由于cin不知道数组的长度(char *当它传递给流时它会衰减为 a),所以它会随感觉写入,这意味着它可以存储多个字符。

cout << sizeof ch;

输出数组的大小(即使用的总空间,以字节为单位),如前所述,为零。

cout << sizeof &ch;

输出数组地址的大小,在你的架构上是 4 个字节,因为它只是一个指针。

cout << "You entered\n" << ch << "\n";

输出存储在数组中的任何内容,但定义不明确,因为正如我所提到的,零长度数组不是标准 C++。此外,由于cout只是在遇到空字节(\0)之前写入内存,因此它写入的内容与您存储的内容一样多,因为再次cout不在乎您是否ch使用 size0或 size 413

于 2013-07-09T17:36:38.100 回答
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;
于 2013-07-09T17:33:41.910 回答