【发布时间】:2018-01-21 07:46:42
【问题描述】:
void func()
{
int arr[5]={1,2,3,4,5};
int variable = arr[1]; //variable will be set to 2
}
当这个程序执行时,将在虚拟地址空间的堆栈区域中分配相当于 5 个整数的连续内存,如下所示的 5 个整数数组。
+---+
| | a[0]
+---+
| | a[1]
+---+
| | a[2]
+---+
| | a[3]
+---+
| | a[4]
+---+
虚拟地址空间(在代码/数据/堆栈/堆段中)是否有空间分配给数组变量arr本身而不是5个整数的数组? p>
如果没有分配,那么-
考虑代码 sn-p - int variable = arr[1];,它会被编译器转换为*(arr+1),并将出现在地址空间的代码段中,只读。 p>
在每次函数调用func 期间,如何将arr 计算为数组arr 的起始地址?由于每次调用函数时调用堆栈的地址都可能发生变化,因此数组arr 的地址也会发生变化。
那么如果没有单独的空间给数组变量arr这怎么实现呢?
【问题讨论】:
-
它以已知偏移量分配在堆栈上。
-
你的图表显示了
arr的内存分配——它在内存中连续五个ints -
是的,每次进入函数时,数组都可以分配到内存中的不同位置(在堆栈上,但“堆栈”被视为实现细节)。那有什么问题?为什么
*(arr+1)必须是一个常量表达式,在编译时求值?为什么获取指向堆栈位置的指针会出现问题?该标准仅告诉您数组在离开其范围后不再存在,并且您不应该让指针超出范围。但是您的问题似乎错误地假设指向事物的指针必须是编译时常量。 -
@DarshanL
int arr[5];声明并定义了一个名为arr的数组对象,其大小为5 * sizeof(int),地址为&arr,就像int variable声明和定义一个@ 987654341@ 对象名为variable,其大小为1 * sizeof(int),位于地址&variable。第一个重复目标阐明了arr不是指针,就像variable不是指针一样。当您意识到arr和variable在分配方面的行为完全相同时,您就会发现第二个问题的答案就足够了。 -
我在这里链接了 2 个问题,因为您确实有 2 个问题。第一个Is an array name a pointer? 回答了这个问题~ 是否为数组本身分配了内存(即你的意思是它是一个指针)=> 没有。然后第二个问题回答:how do compilers assign memory addresses to variables?你的questoin的第二部分。
标签: c pointers memory-address