静态数组和动态数组的区别

问题描述 投票:0回答:3

朋友们,我只是在玩一些指针程序,并意识到 GCC(也许还有 C 标准)区分静态和动态数组。

动态数组有一个占位符来存储数组中元素的地址,而对于静态数组,编译器没有存储元素数组起始地址的内存位置。

我有一个示例程序来演示我的困惑。

#include <iostream>
#int main(void)
{
  int _static[10];
  int *_dynamic;

  _dynamic = new int [10];

  std::cout<<"_static="<<_static<<" &_static="<<&_static<<" &_static[0]="<<&_static[0]<<std::endl;
  std::cout<<"_dynamic="<<_dynamic<<" &_dynamic="<<&_dynamic<<" &_dynamic[0]="<<&_dynamic[0]<<std::endl;

  return 0;
}

对于上述程序,

_static
&_static[0]
在预期行上返回相同的地址。但是,
&_static
也返回与其他两个相同的地址。

因此,

_static
&_static
指的是同一个数字(或者无论我们如何称呼它)。正如预期的那样,
_dynamic
&_dynamic
表示不同的位置。

那么,为什么C标准说

_static
&_static
必须指同一个位置。听起来很混乱。我觉得的原因之一是
&_static
没有多大意义。但那么它的用法不应该被报告为错误吗?

有人可以帮我解决这个困惑吗?

c++ c gcc icc
3个回答
9
投票

函数内的静态数组在堆栈上分配。这样

_static
(衰减为指向第一个条目的指针),
&_static[0]
&_static
具有相同的值,相同的内存地址。

另一方面,动态数组实际上是指向连续内存区域的指针。堆栈中仅存储指针。这就是为什么

&_dynamic
(来自堆栈)和
_dynamic
(来自堆)不同。

希望这张图片能说明一切:

static vs dynamic arrays

还可以看看这篇关于静态和动态全局数组的文章继续extern

和非
extern
之间的区别。


4
投票
其实

_static

&_static
指的不是同一个位置。它们出现的唯一原因是因为您在它退化为指针的上下文中使用 
_static
。也就是说,通过您使用它们的方式,您“使”它们指向相同的位置。但在你这样做之前他们并没有这样做——一个是数组,另一个是指针。它们不可能相同,因为它们是根本不同的东西。

简单来说,静态是在堆栈中创建的,动态是在堆中创建的,在静态数组中,您必须在程序运行之前告诉其大小,但在动态中,您可以从用户那里获取输入,然后创建该大小的数组。

0
投票
静态示例:

int array[5];

动态示例:

int *array; cout << "Enter size of array: "; cin >> size; array = new int[size];


© www.soinside.com 2019 - 2024. All rights reserved.