int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
我理解,如果我执行int *p;
,然后执行*p = 10
,则无效,因为我没有为p
分配任何内存。但是,我想知道是否初始化指向某个地址的指针是否为该指针分配内存?
答案 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;
我想知道是否初始化指向某个地址的指针是否会将内存分配给该指针?
没有。需要在堆栈上分配a
和p
变量,或者如果它们在函数外部,则会将内存分配为全局变量。编译器会自动为您执行此操作,即使您只是...
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
的地址。但是a
和p
的地址是由编译器选择的,无论其初始化或其值的其他变化如何。
我认为你在这里感到困惑的是我们经常在使用指针时分配内存......类似于:
p = new int;
这样做是为int
在运行时动态找到一些内存,将该内存的地址加载到p
中,以便我们可以开始将其称为p
并将其用于存储int
个值。当我们完成它后,我们可以delete p
将内存返回给系统,以便在完成另一个new
时可以回收并使用它。需要在代码中(或在您调用的某个库函数的代码中)显式执行此类分配。
[1] - 优化器可以选择不为a
和/或p
分配实际内存 - 而是使用CPU寄存器,但这不会影响程序的功能行为(它可能会影响表现。)
答案 3 :(得分:3)
指针只是数字。它有一种特殊的类型,以确保它可以代表正确的数字范围,并帮助程序理解,但基本上它只是一个数字。
号代表内存地址。你无法做到这一点:你需要从某个地方获得一个有意义的地址。
你可以:
p = &a
;或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
。 :)