請問,*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 就是取得指針本身的地址,不是指針指向的地址。