C++指针数组内存分配与普通数组相比
C++ pointer array memory allocation vs. normal array
我在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
时,有可能损坏堆栈帧,这可能会导致多种意外结果,从无效到程序崩溃,再到静默数据损坏。
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 如何通过 malloc 为队列数组分配内存?
- 具有动态数组分配的OpenMP嵌套循环
- 如何为数组结构的数组分配内存
- 如何为结构数组分配内存?
- cpp 数组 - 分配常量索引有效,而非常量索引不起作用
- 如何为字符指针数组分配内存?
- 在 C++ 中初始化后的数组分配
- 将数据分配给了数组分配,但程序显示了以缓冲区超支的输出
- C++函数问题中的数组分配
- 子数组分配:使用聚合对象错误的预期"{...}"进行初始化
- 为什么我的指针数组分配不起作用
- std::堆栈和堆栈溢出错误的数组分配
- 在 c++ 中是否有通过声明"implicit"数组分配?
- 在 c++ 中为 2-D "Dynamically Created"数组分配值时遇到问题
- 如何为C++数组分配指向第一个元素的指针
- 字符数组分配
- 将数组分配在固定数量的线程之间
- 为构造函数中的数组分配值