繁体   English   中英

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

[英]Difference between a static and dynamic array

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

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

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

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

希望这张图片显示一切:

静态与动态数组

还要看看这篇关于静态和动态全局数组的文章,继续区分extern和非extern

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

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

静态示例:

int array[5];

动态示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM