我是否需要为初始化的指针分配内存
do I need to allocate memory to an initialized pointer?
int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
我知道如果我做int *p;
然后如果我做*p = 10
,它是无效的,因为我没有为p
分配任何内存。但是,我想知道初始化指向某个地址的指针是否会为该指针分配内存?
我想知道初始化指向某个地址的指针是否会为其分配内存?
它不分配任何内存。因为p
a指向已分配的内存
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= &a
时p
开始指向该变量。
所以*p = 20
意味着使用指针p
实际更改或分配a
的值。
int a = 10;
int *p = &a;
我想知道初始化指向某个地址的指针是否会为该指针分配内存?
不。a
和p
变量需要在堆栈上分配,或者如果它们在函数之外,则会将内存作为全局变量分配。 编译器会自动为您执行此操作,即使您只有...
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
的地址。 但是a
和p
的地址由编译器选择,而不考虑其值的任何初始化或其他更改。
我认为这里让您感到困惑的是,我们在使用指针时确实经常分配内存......像这样:
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
. :)
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- C++为 void 指针分配一个字符串
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- MPI 集合通信中的指针分配
- 函数指针分配在创建 DLL 后导致错误
- 通过双指针分配指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 为什么为char指针分配内存不会截断char序列
- C++指针分配字符数组的地址
- 将 void 指针分配给另一个 void 指针
- 如何将不同的成员函数指针分配给注册类的不同实例?
- 如何为指针分配特定的内存地址?
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 将指针分配给另一个指针时会发生什么情况?
- 为指向C++中的对象/对象的指针分配堆内存
- 将指针分配给字符串变量中包含的地址
- 当直接分配时,为什么此功能指针分配起作用,而不是与有条件的操作员一起使用