用指针创建静态数组?
Posted
技术标签:
【中文标题】用指针创建静态数组?【英文标题】:Creating static array with a pointer? 【发布时间】:2019-11-19 05:02:10 【问题描述】:我知道可以使用 int array[5];
等语法在堆栈上创建数组,其中大小必须在编译时知道,array
是不可修改的左值。
您还可以使用new
在堆上动态创建一个数组,例如int* array = new int[5];
,其中可以具有可变长度的大小并调整数组的大小。
但是像这样的东西呢:
int* array;
array[2] = 3;
cout << array[2] << endl;
这会在堆栈上创建一个看起来可以调整大小的数组,因为我可以继续添加元素。唯一应该跟踪的另一件事是大小。
我在一个项目中不小心写了上面的代码,我从来没有见过它使用过。我不确定是否应该使用它,但我也不确定它有什么不正确的地方。
【问题讨论】:
这是未定义的行为,因为array
是一个未初始化的指针。不要那样做。
这会在堆栈上创建一个数组“ - 不。这不是这段代码所做的。这段代码调用 undefined behavior 正是因为它 没有做你说的。
【参考方案1】:
但是像这样的东西呢:
int* array; array[2] = 3; cout << array[2] << endl;
这会在堆栈上创建一个似乎可以调整大小的数组,因为我可以继续添加元素。唯一需要跟踪的是尺寸。
不。不幸的是,C++ 不能那样工作。如果要使用原始指针创建动态数组,则需要使用 new
分配数组。
这是因为指针只保存地址。他们实际上并不能保证在该地址分配了内存。因此,如果你想使用它,你需要在一个地址上分配内存。
如果您想要动态分配的内存,您还有其他选择,包括使用std::vector
、std::unique_ptr
或std::shared_ptr
。您可以在this question 找到更多信息和一些示例。
【讨论】:
【参考方案2】:写int *array;
确实不创建一个数组,它声明了一个指向某个随机内存页面的指针,如果你试图取消引用这个指针,你的程序将收到“Segmentation fault”信号并且会被关闭。 切勿使用现有对象或已分配对象(使用new
)的地址或返回有效地址的函数/方法进行正确初始化的指针。
【讨论】:
为了清楚起见,这里不保证分段错误,这只是一个未定义的行为。然而,这种特殊的未定义行为在大多数情况下会导致分段错误或内存损坏。以上是关于用指针创建静态数组?的主要内容,如果未能解决你的问题,请参考以下文章