我在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';
我感到困惑的是,即使我仅初始化1的初始大小,为什么myString1都不会编译或什至使用简单的for循环打印每个字符都没有问题。
但是,myString2似乎给了我编译错误,因为我初始化了一个超出数组范围的值。
最佳答案
两者都应导致未定义的行为。您绝对应该避免越界。
但是请注意,两个阵列位于不同的存储区域中。在运行时动态分配的myString1
驻留在免费存储区(或堆)中。
另一方面,myString2
由编译器保留其空间,无论是在自动存储还是静态存储中。您的示例表明您正在使用自动存储,在我们的大多数普通PC中,该存储位于程序堆栈中。因此,当您弄乱myString2
时,很有可能破坏堆栈帧,这可能会导致许多意外结果,从无影响到程序崩溃,都会经历静默数据破坏。