我是否需要为初始化的指针分配内存

do I need to allocate memory to an initialized pointer?

本文关键字:指针 分配 内存 初始化 是否      更新时间:2023-10-16
int a = 10;    
int *p = &a; 
*p = 20;  /* Is this a valid statement? */

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

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

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

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
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= &ap开始指向该变量。

所以*p = 20意味着使用指针p实际更改或分配a的值。

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

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

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

int a;    
int* p; 

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

使用&a初始化p只是将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 寄存器,但这不会影响程序的功能行为(可能会影响性能)。

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

该数字表示内存地址。你不能只是编造这些:你需要从某个地方得到一个有意义的地址。

您可以:

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

就是这样,一旦你有了一些内存的地址,你就完成了!现在,您可以使用*运算符取消引用指针,无论您喜欢以下位置:*p = somedata

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

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

"为其分配内存"是什么意思?创建指针时,您正在分配(静态)其内存,或者换句话说,分配它保持存在所需的内存。

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

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

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