内存分配给指针的名称或指针的地址?

时间:2015-06-16 06:07:01

标签: c++ c memory-management

当我们在代码中有内存分配或内存释放时,内存被分配给什么?

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

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

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

考虑这个例子:

#include"stdio.h"
main()
{
char *A,*B;
A=B; //A and B have same address(point to-location) but different name,
A=new char[10]; //is the allocation, matter of the name (A as string) or the  location (A as address)
B=new char[20];
A[18]='C';//is this really OK or we have potentially hidden error?
} 

6 个答案:

答案 0 :(得分:3)

使用malloc时,会在堆上分配一块内存(如果malloc成功),并使指针指向已分配内存的开头(假设您使用{ {1}}而不仅仅是pointer = malloc(...))。

答案 1 :(得分:2)

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

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

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

的Nb。当你被建议使用好的变量名时......这并不意味着你必须为了使处理器满意。您应该只因为您的代码可能必须由其他人阅读或维护。有意义的变量名称是人类阅读的必要条件。

答案 2 :(得分:1)

我的回答是:

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

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

b)在这个例子中,在这一行:

A[18]='C';

我们有潜在的内存错误,因为分配&#34; A = B&#34;在B的记忆分配之前,不要对A进行任何改变。

答案 3 :(得分:0)

要回答您的问题,让我们看看一段代码,好吗?这样,恕我直言,这将更容易解释情景。

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

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

  1. 首先,p已定义并初始化为NULL
  2. 调用
  3. malloc(),并考虑成功案例,将返回的内存地址分配给p。因此,现在,p指向已分配的内存。
  4. 最后调用free()后,分配的内存块将被释放(不能再使用)。
  5. 所以,回答你的问题:

      

    将内存分配给变量 - 由名称标识的内容 - 或分配给内存地址 - 由数字标识?

    通常,存储器地址(通过数字本身)被分配给变量。换句话说,内存被分配给进程,它以内存地址的形式调用malloc()

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

答案 4 :(得分:0)

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

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

你的问题具有巨大的意义和剂量。如果您不理解这一重要概念,则无法使用C编程。

根本没有分配内存。分配内存地址。

答案 5 :(得分:0)

让我们举个例子

main()的   { //这为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?

} 

问题:

  

当我们在代码中有内存分配或内存释放时,内存被分配给什么?

     

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

     

     

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

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

  

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

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