我传入一个指向函数的双指针,然后函数在堆上分配空间并将双指针重定向到该内存位置。然后在主要我们应该能够访问内存位置及其内容
我的代码:
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。
有人可以帮助我解决我在这里的误解吗?:)谢谢
答案 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。