请问,*p,&p,* &p,这三个的区别是什么?
为什么我在开辟空间时,参数设置成*p,后面的插入等操作就无法实现,而换成 * &p之后,就可以实现了
请问,*p,&p,* &p,这三个的区别是什么?
为什么我在开辟空间时,参数设置成*p,后面的插入等操作就无法实现,而换成 * &p之后,就可以实现了
你所指的就是常见的编程错误之一,返回指向栈内存的指针。
void fun( int *p )
{
p = (int *)malloc(sizeof(int));
}
int main(void)
{
int *ps;
fun(ps);
printf("heap set\n");//可以执行到此
*p = 5;//Segmentation fault 发生段错误
free(ps);
return 0;
}
fun 函数的参数在栈中,当fun函数结束的时候,fun所持有的栈内存就会消失。p也会消失。在上例中,你实际上传人的是一个指针值,就和其他类型一样
,指针也有值,只不过指针的值是一个地址而已,所以你fun(ps)的时候,只是把ps的值(一个地址)copy到p,实际上,ps和p就不在同一个
地方,当fun返回后,p消失了,你也就不知道它所申请的内存在哪里了,所以程序可以执行到printf,再往下执行,*p发生段段错误,因为你想要给
未知的内存区域赋值。
Int *p,这是声明p是指针变量,
*p 这样是要引用p所指向的内存,例如上例中*p = 4;
&p 就是取得指针本身的地址,不是指针指向的地址。