我想知道以下声明无效,
int* p;
*p = 3;
但是下面的陈述是
int* p; int a;
a = 9;
p = &a;
*p = 3;
为什么我不能在给它一个地址之前给它一个值,但可以在分配一个地址后给它。感谢
答案 0 :(得分:2)
指针只是一种特殊类型的变量,它将内存地址作为其值。在初始化之前,它可能指向任何随机存储器地址。
取消引用指针(使用*p = 3
语法)告诉计算机转到p
指向的内存地址,并将值3存储在该位置
所以很明显,没有有效的内存位置,这是有问题的。这是通过分配获得有效内存地址的一种可能方式:
int *p = new int;
*p = 3;
第一行做了两件事:1)在堆上为int分配内存,2)将指针p
的值设置为分配的内存的地址。
答案 1 :(得分:0)
如果没有初始化指向地址,指针将包含一些垃圾地址,这是您在第一个示例中尝试写入的地址。为了有效,指针必须引用您拥有的某个有效内存,这需要您将其设置为一个地址。