C ++中字符数组的内存分配

时间:2013-07-09 17:21:26

标签: c++

#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 chchar ch[0]的内存分配有何不同? ch可以接受一个字符,但ch[0]可以接受多个字符(我输入qqqqqqqq)。为什么?另外,为什么sizeof ch会返回0,而sizeof &ch会返回4,但ch会接受超过四个字符?

2 个答案:

答案 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;