int *p1=10;
和
int *p2;
p2=new int;
*p2=10;
这两个变量有什么区别? 是不是在堆中分配了变量?
答案 0 :(得分:4)
不同之处在于第一个不编译:
lol.cpp:2:10: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int'
int *p1 = 10;
^ ~~
1 error generated.
而第二个在堆上创建一个值为10的int,并在堆栈上分配一个指向该值的指针。
如果第一个编译了,比如说你添加了一个演员,它会将值10分配给指针 p1
,这意味着p1
会指向到内存地址10 = 0x0A
,*p1
会尝试将该地址解引用为int,这将是一个段错误。 (如果你在进程的内存空间中使用了不同的数字,那么根据内存的内容,它会是一些任意整数。)
答案 1 :(得分:1)
根据你问题的另一部分。不,它们都没有在堆上分配。实际上它们都是在堆栈上分配的。只有第二个指向new
运算符在堆上分配的区域。它们将被分配在堆上,如果它们是使用new
全部对象的一部分。
答案 2 :(得分:0)
表达式int* p1 = 10
不应该编译:它初始化一个带整数的指针!
答案 3 :(得分:0)
p1
和p2
都是整数变量的指针。
p1
的初始化是错误的。作为指针,它应该包含整数变量的地址。并且您将“地址”指定为值“10”:您将其设置为指向地址0x0000000A
,这几乎肯定无效。