数组本身的名称,存储在哪里

数组的名称如何存储在内存中?

例如,如果我写:

char arr[10]; 

数组项存储在内存中,从虚拟地址&arr[0] ,实际上arr的值, 但是arr本身存储在哪里?

静态多维数组的行也是如此:

 char arr[10][20]; 

arr本身也是arr [0],arr [1] …. arr [9]都没有地址本身。

那么名称存储在哪里?

如果您指的是您声明的文字名称 ,除非您使用调试符号-g编译,否则通常会将其编译出来。

如果在堆栈上声明了某些内容,则机器代码通常将数组元素称为与帧指针$ebp的偏移量。

要回答您的隐含问题,对于堆栈上的数组, 它不存在 。 机器代码不知道arr是什么。 它只知道使用偏移(代码中的索引)有一个内存区域。

这个问题对堆上的数组更有意义,因为现在你有一个指针(它有自己的地址),以及保存实际数组的存储器(存在于堆中,并存储在指针内)。

请考虑以下代码。

  char* arr = malloc(5); 

假设您使用调试符号进行编译,如果您在gdb查看&arr ,您将看到存储指针arr的地址。

如果在堆栈上创建指向数组的单独指针,则可以演示相同的内容。

  char arr[10]; char* ptr = arr; 

在这里,您将看到ptr具有单独的存储( p &ptr ),并且将arr的地址保存为其值,但是&arr本身等于其第一个元素的地址。

编译时,数组的名称将丢失。 它仅供参考。 元素存储在堆栈中,但编译后数组名称将丢失,除非您在调试中没有-g选项。

arr本身也是arr [0],arr [1] …. arr [9]都没有地址本身。

arr只是数组的基地址。 通过向该地址添加偏移来定位各个元素。 编译代码后,除了调试之外,数组的名称没有用。

正如其他人所说,变量的名称是源代码中的符号 。 它们不会被编译器转换为机器代码,因此无法找到 ,尽管它们可以使用适当的选项附加到您的可执行文件(例如gcc中的-g ,它将以操作系统的本机格式生成调试信息)调试目的。

在机器代码中,变量由内存位置引用,内存位置可以是多种多样的,具体取决于机器和编译器:函数参数和局部变量将取决于调用约定和优化,并且通常(在x86上)计算从特殊寄存器%ebp(称为基指针 )和偏移量。 它们也可以直接作为寄存器传递(例如,第一个参数可以转换为通用寄存器),或者作为内存中不同的特殊地址(特定于函数)的偏移量。 取消引用指针时,变量的地址是从内存间接获得的(如果使用动态内存分配,例如malloc ,则可能仅在运行时可用)。

在底线,在机器代码中,您通常不会找到变量名(从C编译时)。 相反,你有寄存器和地址(或者,确切地说,你必须猜测的数字常量和计算值是地址),这是为什么只通过查看二进制来理解代码的原始含义是一个难题(尽管尝试将二进制文件反编译为汇编代码会产生问题)。