簡體   English   中英

將指針的值更改為ac函數中的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM