C++指针数组内存分配与普通数组相比

C++ pointer array memory allocation vs. normal array

本文关键字:数组 分配 指针 内存 C++      更新时间:2023-10-16

我在C++中玩过,我意识到指针数组和常规数组之间有很大的区别。

char *myString1 = new char[1];
char myString2 [3];
myString1[0] = 'a';
myString1[1] = 'b';
myString1[2] = 'c';
myString1[3] = 'd';
myString2[0]='a';
myString2[1]='b';
myString2[2]='c';
myString2[3]='d';

我很困惑为什么myString1使用简单的for循环编译甚至打印每个字符都没有问题,尽管我只是初始化了初始大小为1的字符。

然而,myString2似乎给了我编译错误,因为我初始化了一个数组边界之外的值。

两者都应该导致未定义的行为。你绝对应该避免越界。

然而,请注意,这两个阵列位于不同的存储器区域中。myString1在运行时动态分配,驻留在空闲存储(或)中。

另一方面,myString2的空间由编译器保留,要么在自动存储中,要么在静态存储中。您的示例表明您使用的是自动存储,在我们大多数常见的PC中,它位于程序堆栈中。因此,当您使用myString2时,有可能损坏堆栈帧,这可能会导致多种意外结果,从无效到程序崩溃,再到静默数据损坏。