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

时间:2014-03-22 00:10:14

标签: 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);
}

当我使用gdb在grab_letter调用之后检查s的返回值时,它是0x0。

有人可以帮助我解决我在这里的误解吗?:)谢谢

4 个答案:

答案 0 :(得分:4)

您必须将指针传递给您正在执行的指针,但指针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。然后只需取消引用它并指向它。

答案 1 :(得分:1)

这里有几个问题。一个是主要声明一个双重间接指针。单一的间接将是足够好的,更重要的是。更重要的是不要声明指针,而是将一个简单的字符变量作为参数传递:

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

这可能是你想到的逻辑形式。

答案 2 :(得分:0)

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

以上是借用自我的答案。

答案 3 :(得分:-1)

C按值传递所有参数。因此传入grab_letter的s只是一个值。要在外部更改s的值,您需要将& a分配给* s。