朋友们,我只是在玩一些指针程序,并意识到 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
之间的区别。
_static
和
&_static
指的不是同一个位置。它们出现的唯一原因是因为您在它退化为指针的上下文中使用
_static
。也就是说,通过您使用它们的方式,您“使”它们指向相同的位置。但在你这样做之前他们并没有这样做——一个是数组,另一个是指针。它们不可能相同,因为它们是根本不同的东西。简单来说,静态是在堆栈中创建的,动态是在堆中创建的,在静态数组中,您必须在程序运行之前告诉其大小,但在动态中,您可以从用户那里获取输入,然后创建该大小的数组。
int array[5];
动态示例:
int *array;
cout << "Enter size of array: ";
cin >> size;
array = new int[size];