[英]changing the value of pointer to a pointer in a c function
我傳入一個函數的雙指針,然后函數在堆上分配空間,並將雙指針重定向到該內存位置。 然后在主要我們應該能夠訪問內存位置及其內容
我的代碼:
void grab_letter(char **s){
char *a = (char *) malloc(sizeof(char));
*a = 'r';
s=&a;
}
int main(){
char **s;
grab_letter(s);
printf("returned:%c\n",**s);
}
當我使用gdb在grab_letter調用之后檢查s的返回值時,它是0x0。
有人可以幫助我解決我在這里的誤解嗎?:)謝謝
您必須將指針傳遞給您正在執行的指針,但指針s未指向任何有效的內存。
void grab_letter(char **s){
char *a = malloc(sizeof(char));
*a = 'r';
*s=a; //dereference the pointer to pointer s and point it to a
}
int main( void ){
char *s;
grab_letter(&s); //pass the address of pointer
printf("returned:%c\n",*s);
}
而是傳遞指針s的地址。 雙指針現在指向主要的原始指針s。 然后只需取消引用它並指向它。
這里有幾個問題。 一個是主要聲明一個雙重間接指針。 單一的間接將是足夠好的,更重要的是。 更重要的是不要聲明指針,而是將一個簡單的字符變量作為參數傳遞:
int main()
{
char s;
grab_letter(&s);
printf("returned:%c\n", s);
}
隨着更改,不需要任何malloc()
和參數處理非常簡單:
void grab_letter(char *s)
{
*s='r';
}
如果你真的想使用雙重間接指針,那就可以了;
void grab_letter(char **s)
{
*s = malloc (sizeof (char));
**s = 'r';
}
int main()
{
char *s;
grab_letter(&s);
printf("returned:%c\n", *s);
}
這可能是你想到的邏輯形式。
char **s;
上面的代碼delcares s作為指向char指針的指針,這不是你想要的。 相反,你想要:
char *s;
grab_letter(&s);
grab_letter期待指向指針的指針,因此您需要將指針的地址傳遞給它。
void grab_letter(char **s){
char *a = (char *) malloc(sizeof(char));
*a = 'r';
s=&a;
}
上面的問題是指針a在堆棧上,並且您正在為該地址分配s,該函數在函數返回時可能有效,也可能無效。 此外,您要做的是將新malloc的地址返回給調用者,因此您應該取消引用s,因為s是指向指針的指針,然后為其分配存儲在a中的地址。
void grab_letter(char **s){
char *a = (char *) malloc(sizeof(char));
*a = 'r';
*s = a;
}
以上是借用自我的答案。
C按值傳遞所有參數。 因此傳入grab_letter的s只是一個值。 要在外部更改s的值,您需要指定&a到* s。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.