我需要为初始化指针分配内存吗?

时间:2012-12-04 11:01:00

标签: c++ c pointers memory-management

int a = 10;    
int *p = &a; 

*p = 20;  /* Is this a valid statement? */

我理解,如果我执行int *p;,然后执行*p = 10,则无效,因为我没有为p分配任何内存。但是,我想知道是否初始化指向某个地址的指针是否为该指针分配内存?

7 个答案:

答案 0 :(得分:6)

  

我想知道是否初始化指向某个地址的指针是否为其分配内存?

它不分配任何内存。因为p 指向已分配的内存

int a = 10;    // a is statically allocated and value 10 is assigned.
int *p = &a;  // p is pointed to address of a. 
*p = 20;  // at this point p points to that statically allocated memory

答案 1 :(得分:5)

int a = 10;    
int *p = &a; 

*p = 20;  /* Is this a valid statement? */

在这种特殊情况下,答案是YES

但是当你喜欢这样的时候:

int *ptr;  //declaration of pointer variable
*ptr = 20;  // It means you are assigning value 20 to the variable where `ptr` points to.

但实际上ptr并没有指向任何地方,基本上它意味着它有indeterminate value

这样做*ptr = 20会将值20放到ptr指向的内存地址。 所以它被称为Undefined bahavior

在你的情况下,它是有效的,因为&a是有效的内存位置,p在我们执行p= &a时开始指向该变量。

所以*p = 20表示使用指针a实际更改或指定p的值。

答案 2 :(得分:4)

int a = 10;    
int *p = &a; 
  

我想知道是否初始化指向某个地址的指针是否会将内存分配给该指针?

没有。需要在堆栈上分配ap变量,或者如果它们在函数外部,则会将内存分配为全局变量。编译器会自动为您执行此操作,即使您只是...

int a;    
int* p; 

...没有= <expression>指定其初始值。会发生什么基本上是在内存中的某个地址,将保留一些字节(可能是4或8)来存储您标识为a的值,并在另一个地址存储更多内存(可能是4或8)将保留字节)以存储您调用的值p

使用p初始化&a只会将a的数字地址复制到p的内存中...它不会导致[1}的分配],也不要移动他们的记忆。

使用一些虚构的地址可能有助于这样看待它......

MEMORY-ADDRESS            CONTENTS           NAME
1000                      10                 a
2000                      1000               p

此处,p“指向”a,因为p的内存保留a的地址。但是ap的地址是由编译器选择的,无论其初始化或其值的其他变化如何。

我认为你在这里感到困惑的是我们经常在使用指针时分配内存......类似于:

p = new int;

这样做是为int在运行时动态找到一些内存,将该内存的地址加载到p中,以便我们可以开始将其称为p并将其用于存储int个值。当我们完成它后,我们可以delete p将内存返回给系统,以便在完成另一个new时可以回收并使用它。需要在代码中(或在您调用的某个库函数的代码中)显式执行此类分配。

[1] - 优化器可以选择不为a和/或p分配实际内存 - 而是使用CPU寄存器,但这不会影响程序的功能行为(它可能会影响表现。)

答案 3 :(得分:3)

指针只是数字。它有一种特殊的类型,以确保它可以代表正确的数字范围,并帮助程序理解,但基本上它只是一个数字。

代表内存地址。你无法做到这一点:你需要从某个地方获得一个有意义的地址。

你可以:

  • 获取现有变量的地址:p = &a;或
  • 从&#34;堆&#34;:p = malloc(size)
  • 分配一些内存

那就是它,一旦你拥有了一些记忆的地址,你就完成了!您现在可以使用*运算符取消引用指针:*p = somedata

答案 4 :(得分:2)

不,它不分配内存。您的p实际上指向与&a相同的位置,并且您在*p = 20;中修改了相同的内存。这不会崩溃,因为您引用了已分配的内存(对于a)。如果这是你真正想要的只取决于你。

答案 5 :(得分:1)

  

但是,我想知道是否初始化指向某个地址的指针是否为它分配内存?

“为它分配内存”是什么意思?当你创建一个指针时,你正在(静态地)分配它的内存,换句话说,就是它保持存在所需的内存。

除此之外,还有指针指向的内存。当你说int a = 10时,你正在创建一个int并分配一个足够大的内存空间来容纳它。
然后说p = &a意味着:“我的指针必须指向存储a的内存地址”。显然你已经分配了a,所以你可以安全地使用*p,但一般来说这不是真的,你可能有一个未初始化的指针指向某个非法地址。

答案 6 :(得分:0)

不,不需要。因为您的指针指向a变量的地址。因此,当您使用*p = 20时,a的值会发生变化。

所以,你的问题的答案是YES。 :)