用指针创建静态数组?

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::vectorstd::unique_ptrstd::shared_ptr。您可以在this question 找到更多信息和一些示例。

【讨论】:

【参考方案2】:

int *array; 确实创建一个数组,它声明了一个指向某个随机内存页面的指针,如果你试图取消引用这个指针,你的程序将收到“Segmentation fault”信号并且会被关闭。 切勿使用现有对象或已分配对象(使用new)的地址或返回有效地址的函数/方法进行正确初始化的指针。

【讨论】:

为了清楚起见,这里不保证分段错误,这只是一个未定义的行为。然而,这种特殊的未定义行为在大多数情况下会导致分段错误或内存损坏。

以上是关于用指针创建静态数组?的主要内容,如果未能解决你的问题,请参考以下文章

用数组代替指针实现静态链表

静态链表和动态链表的区别

C ++创建指向标头内所有公共静态成员函数的指针数组,然后使用它

静态链表代码

静态链表循环链表双向链表

线性表文档之静态链表