将指针的值更改为c函数中的指针

将指针的值更改为c函数中的指针,c,pointers,C,Pointers,我传入一个指向函数的双指针,然后函数在堆上分配空间,并将双指针重定向到该内存位置。然后,我们基本上应该能够访问内存位置及其内容 我的代码: 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)

我传入一个指向函数的双指针,然后函数在堆上分配空间,并将双指针重定向到该内存位置。然后,我们基本上应该能够访问内存位置及其内容

我的代码:

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);
}
当我在grab_字母调用后使用gdb检查s的返回值时,它是0x0


有人能帮我解释一下我在这里误解了什么吗?:)谢谢

C按值传递所有参数。因此,传递到grab_字母中的s只是一个值。要更改外部s的值,需要将&a指定给*s。

这里有几个问题。一个是main声明了一个双间接指针。单独间接就足够了,而且更切中要害。更重要的是,不是声明指针,而是传递一个简单的字符变量作为参数:

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);
}

这可能会执行您心目中的逻辑形式。

您必须将指针传递给正在执行的指针,但指针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现在指向主菜单中的原始指针s。然后把它解引用,指向a

char **s;
上面的代码将dels作为指向char指针的指针,这不是您想要的。相反,您希望:

char *s;
grab_letter(&s);
grab_字母需要指向指针的指针,因此需要向其传递指针的地址

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;
}

以上是从self的答案中借用的。

您希望将一个指针分配给另一个指针。也就是说,
s
指向您希望
&a
成为的指针。所以
*s=&a
除此之外,您将使
*s
指向一个本地指针,这将导致未定义的行为。@PauloBu我不是让它指向一个本地指针,而是指向一个在堆上分配的位置,
抓取字母中的
s
未初始化。@抖动,但问题是它没有指向任何内容。在试图通过调用
grab_字母在堆中存储某些内容之前,您从未从堆中为其分配内存。如果您想这样做,您需要,
s=malloc(sizeof(char*))后接
抓取字母(&s)。这将导致未定义的行为。可能OP想要使用malloc,保留该问题的解决方案将是最好的。我试图通过双指针了解malloc的使用,我知道使用单指针pointer@self.:也许吧。但既然这是一个新手问题,我觉得有义务这么做。@wallyk,好了,给你。@wallyk谢谢你的回答,我理解你的吻。这更多的是学习如何理解指针的传递,尤其是双指针。