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

Memory allocation of character array in C++

本文关键字:内存 分配 数组 字符 C++      更新时间:2023-10-16
#include<iostream>
using namespace std;
int main()
{
    cout<<"Entern";
    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]可以接受许多字符(我放入了 qqqqq(。为什么?另外,为什么sizeof ch返回 0 而 sizeof &ch 返回 4,而 ch 接受四个以上的字符?

让我们一行一行:

char ch[0];

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

cin >> ch;

将读入的任何内容放入零长度数组中。由于cin不知道数组的长度(当它被传递到流时,它会衰减成一个char *(,所以它会尽可能多地写入,这意味着它可以存储超过零个字符。

cout << sizeof ch;

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

cout << sizeof &ch;

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

cout << "You enteredn" << ch << "n";
输出存储到数组中的任何内容,数组没有

明确定义,因为正如我提到的,零长度数组不是标准C++。此外,由于cout只是写入内存,直到遇到空字节((,因此它写入的内存与您存储的一样多,因为同样,cout不在乎您是使用大小0还是大小413ch

字符 ch 和字符 ch[0] 的内存分配有什么区别?

区别在于编译器将在多大程度上保护您免受自己的伤害。 数组只是一个顺序内存块,C++没有数组越界异常,并且在写入之前不会检查数组边界。 通过使用

char ch[0];

您已经告诉C++编译器您将负责边界检查。 这是缓冲区溢出(记住那些(。 当你为ch[0]分配类似"qqqq"的东西时,你已经覆盖了属于其他变量、函数或程序的其他内存。 如果您需要更好的理解,请尝试运行下面的程序。

// 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;