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

cczfrluj  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(102)

我在玩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在编译甚至打印每一个字符时都没有问题,即使我只是初始化了一个初始大小为1的字符。
然而,myString2似乎给了我编译错误,因为我初始化了一个超出数组边界的值。

svgewumm

svgewumm1#

两者都应该导致未定义的行为。你绝对应该避免越界。
但是,请注意,这两个数组位于不同的内存区域。myString1在运行时动态分配,驻留在 * 自由存储区 *(或 * 堆 *)中。
另一方面,myString2的空间由编译器保留,无论是在自动存储还是静态存储中。您的示例表明您正在使用自动存储,在我们大多数常见的PC中,自动存储位于程序堆栈中。因此,当您弄乱myString2时,您有可能损坏堆栈帧,这可能会导致许多意想不到的结果,从无效到程序崩溃,经历无声的数据损坏。

相关问题