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

时间:2012-07-12 04:33:43

标签: c++ c gcc compiler-construction icc

朋友我刚刚玩了一些指针程序,并意识到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没有多大意义。但那么它的使用不应该被报告为错误吗?

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

3 个答案:

答案 0 :(得分:9)

函数内的静态数组在堆栈上分配。这种方式_static(作为第一个条目的指针衰减),&_static[0]&_static具有相同的值,相同的内存地址。

另一方面,动态数组实际上是指向连续内存区域的指针。只有指针存储在堆栈中。这就是为什么&_dynamic(来自堆栈)和_dynamic(来自堆)不同。

希望此图片能够全部显示:

static vs dynamic arrays

请继续查看此article about static and dynamic global arrays the distinction between extern and non-extern

答案 1 :(得分:4)

实际上_static&_static并未引用相同的位置。它们出现的唯一原因是因为你在一个上下文中使用_static它会衰变成一个指针。也就是说,通过您使用它们的方式,您制作它们引用相同的位置。但他们之前没有这样做 - 一个是数组而另一个是指针。它们不可能是相同的,因为它们是根本不同的东西。

答案 2 :(得分:0)

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

静态示例:

int array[5];

示例动态:

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