繁体   English   中英

数组变量在哪里用C语言存储?

[英]Where is an array variable stored in C language?

#include <stdio.h>

int main(){
    int array[] = {1,2,3};
    printf("L00: array[0]=%d \n",array[0]);
    printf("L01: array[1]=%d \n",array[1]);
    printf("L02: array[2]=%d \n",array[2]);
    printf("L03: &array[0]=%p \n",&array[0]);
    printf("L04: &array[1]=%p \n",&array[1]);
    printf("L05: &array[2]=%p \n",&array[2]);
    printf("L06: array=%p \n",array);
    printf("L07: &array=%p \n",&array);
    return 0;
}

在该程序中,L03,L06和L07分别显示( &arrayarray&array[0] )相同的存储器地址。

所以我很好奇“阵列”作为RAM中变量的位置。

如果RAM中没有“数组”的位置,它在哪里?

C11标准规范没有提及有关RAM,IIRC的任何内容(但请自行检查,阅读n1570 )。 在大多数操作系统上进程具有虚拟地址空间 (并且您的程序将在该空间中运行,而不一定在RAM中运行)。

您的阵列(可能)位于调用堆栈中

我想一个假设的优化编译器可能足够聪明,可以把它放在别处(但我不能说这样的编译器)。

我必须多次写这篇文章,但让我们再说一遍:

+----------+----------+----------+
| array[0] | array[1] | array[2] |
+----------+----------+----------+
^          ^          ^          ^
|          |          |          |
array      |          |          |
|          |          |          |
array + 0  array + 1  array + 2  |
|          |          |          |
&array[0]  &array[1]  &array[2]  |
|                                |
&array                           |
|                                |
&array + 0                       &array + 1

从上面的“图像”可以看出,第一个元素可以通过五个指针到达(两个实际上, array衰减到&array[0] ,而array + 0等于array )。

这些指针的类型可能不同但是:

  • &array的类型为int (*)[3]
  • &array + 0等于&array ,因此属于同一类型
  • &array[0]的类型为int *
  • array衰减到&array[0] ,因此属于同一类型
  • array + 0等于array ,因此属于同一类型

当然有其他方法可以获得指向特定元素的指针,但它们实际上只是上述的变体。 例如(&array)[0]等于&array + 0 ,它等于&array

另一件值得注意的事情是,对于任何指针数组p和索引i ,表达式p[i]*(p + i)完全相同。


你应该从中学到的最重要的事情是array&array之间的区别。 即使它们都指向相同的位置,它们的类型也不同,这使得它在语义上非常不同。

除了具有“自动存储持续时间”和本地范围之外,C标准并未规定存储阵列的位置。 具有自动存储持续时间的较大变量几乎肯定存储在堆栈中。

至于为什么这3种不同形式的语法给出相同的地址:

  • array ,无论何时在表达式中使用,都会衰减为指向第一个元素的指针。 使其100%等效于&array[0]
  • &array是指向整个数组的指针 - 一个数组指针。 这是一种不同的类型,可用于对整个数组进行指针运算,但除此之外,它仍然指向数组开始的相同地址。

(&array,array和&array [0])相同的内存地址。

是的,但它们的类型不同。

  • &array的类型为int (*) [3]
  • array的类型为int [3] (有时会衰减为指向第一个元素的指针)
  • &array[0]的类型为int *

根据定义,数组的内存分配是连续的,它从&array[0]并上升到n-1元素, n是维度。

如果RAM中没有“数组”的位置,它在哪里?

如果用“RAM”表示物理内存地址,那么你的概念是错误的。 大多数情况下,你没有直接使用任何物理内存,它是抽象给你的。 打印的内存位置来自分配给程序的虚拟进程地址空间。

根据存储持续时间,您可以看到位置不同,即,如果阵列具有自动存储,它将驻留在功能堆栈(调用堆栈)上,它具有static存储,可能它将在.bss部分。 有时它也可能会被优化(不是在这种情况下,如果不使用),所以这取决于环境。 除非编译器决定分配它,否则无法保证分配。

暂无
暂无

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

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