[英]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
(来自堆)的不同。
希望这张图片显示一切:
实际上_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.