要声明指针变量,内存是否分配给指针的名称或指针的地址?

to declare a pointer variable, does memory assign to the pointer's name or pointer's address?

本文关键字:指针 地址 分配 变量 声明 内存 是否      更新时间:2023-10-16

内存是否分配给指针的名称或指针的地址?我们可以在没有任何变量声明的情况下将内存分配给特定的法定地址(例如:0x7fff12345678),或者我们可以声明指针变量并分配内存但具有特定的法定地址吗?

计算机不处理变量名称。变量名称(无论是什么)仅用于帮助您在编写程序时引用内存,并由编译器用于了解您希望程序如何工作。

处理器不处理名称或字符串。当你分配一些东西时,通常会返回一个指向内存地址的指针。指针的名称无关紧要;地址和您分配的内存量:这才是最重要的。操作系统决定是否满足您的内存分配请求。除非你的程序是唯一在机器上运行的程序(即你自己编写操作系统),否则你不能只是假设一个地址是空的,然后通过指针在那里写任何你想要的东西(这将以眼泪结束)。即使在这种情况下,由于硬件映射,您也会受到地址限制。

编译程序(发布模式)后,指针名称和变量名称将丢失,程序仅处理内存地址。

注意:当你被建议使用好的变量名时,这并不意味着你必须为了让处理器满意而这样做。您之所以应该这样做,只是因为您的代码可能必须由其他人读取或维护。有意义的变量名称对于人类阅读是必需的。

当你使用

malloc 时,会在堆上分配一个内存块(如果malloc成功),并且指针指向分配的内存的开头(假设你使用 pointer = malloc(...) 而不是简单地malloc(...))。

让我举个例子

主(){这将为 A,B 分配内存(通常在堆栈上)

char *A,*B;

此时 A 和 B 具有完全未定义的值。因此,进行此赋值会将位于 A 中 B 处的任何未知值放置。

A=B; //A and B have same address(point to-location) but different name,

这将分配 10 个字节并将这些字节的位置存储在 A 中。

A=new char[10]; //is the allocation, matter of the name (A as string) or the  location (A as address)

这将分配 20 个字节并将这些字节的位置存储在 B 中。

B=new char[20];

这是完全不可预测的,并且可能会搞砸一些东西。

A[18]='C';//is this really OK or we have potentially hidden error?
} 

对于您的问题:

当我们在 Code 中进行内存分配或内存释放时,内存分配给什么?

1-指针的名称(或与编译器相关的任何名称寻址)

2-指针的地址(我们通常可以取消引用它并获取内存内容)?

在 C 中,内存地址存储在为指针分配的内存中。

换句话说:我们可以在没有任何变量声明的情况下将内存分配给特定的法定地址(例如:0x7fff12345678)吗?

为了很好地理解发生了什么,你真的需要学习汇编语言。可以在没有任何内存位置的情况下分配内存并存储在寄存器中。

我的答案是:

a) 分配给地址的内存,

换句话说,用于将 int[10] 内存分配给特定的法定地址(例如:0x7fff12345678),没有任何 int 变量声明,:我们可以写

*reinterpret_cast<int**>( 0x7fff12345678)=new int[10];

b) 在示例中,在此行中:

A[18]='C';

我们有潜在的内存错误,因为赋值"A=B",在 B 的内存分配之前,对 A 没有任何变化。

这是一个地址。指针指向(或更好地存储)该地址(这是分配内存的起始地址)。

通过取消引用指针,您可以设置/获取存储在内存中的值(从该地址开始)。

你的问题具有巨大的意义和剂量。如果你不理解这个重要的概念,你就不能用C编程。

根本不分配内存。分配内存的地址。

为了回答您的问题,让我们看一段代码,好吗?这样,恕我直言,解释这种情况会更容易。

int * p = NULL;          //define a pointer, set it to NULL
p = malloc(sizeof*p);   //allocation, assume success
....
free(p);                //de-allocation

在这里,如您所见,p是指向int的指针。在代码中

  1. 首先,定义并初始化pNULL
  2. 调用malloc(),并考虑成功案例,将返回的内存地址分配给p 。因此,现在,p指向分配的内存。
  3. 最后,一旦调用free(),分配的内存块就会被释放(不能再使用)。

所以,回答你的问题:

内存被分配给一个变量 - 由名称标识 - 或分配给内存地址 - 什么由数字标识?

通常,内存地址(本身就是一个数字)分配给一个变量。换句话说,内存以内存地址的形式分配给调用malloc()的进程

FWIW,如果你不从malloc()收集返回的指针,你就无法访问(如果)分配的内存。您需要在某个变量中收集 malloc() 的返回值。