在C语言中返回指针到指针参数

在C语言中返回指针到指针参数,c,pointers,C,Pointers,我想知道为什么以下两个函数返回不同的结果: GetPtr的结果总是空的,而GetPtr2返回一个指向参数的指针,即预期的行为 #include <stdio.h> unsigned char ** GetPtr(unsigned char *ptr) { return &ptr; } unsigned char ** GetPtr2(unsigned char *ptr) { unsigned char **ptr2 = &ptr; ret

我想知道为什么以下两个函数返回不同的结果: GetPtr的结果总是空的,而GetPtr2返回一个指向参数的指针,即预期的行为

#include <stdio.h>

unsigned char ** GetPtr(unsigned char *ptr)
{
    return &ptr;
}

unsigned char ** GetPtr2(unsigned char *ptr)
{
    unsigned char **ptr2 = &ptr;
    return ptr2;
}

int main()
{
    unsigned char *test = (unsigned char *) malloc(10 * sizeof(unsigned char));

    printf("%p \n", GetPtr(test));
    printf("%p \n", GetPtr2(test));

    free(test);

    return 0;
}
#包括
无符号字符**GetPtr(无符号字符*ptr)
{
返回&ptr;
}
无符号字符**GetPtr2(无符号字符*ptr)
{
无符号字符**ptr2=&ptr;
返回ptr2;
}
int main()
{
无符号字符*测试=(无符号字符*)malloc(10*sizeof(无符号字符));
printf(“%p\n”,GetPtr(test));
printf(“%p\n”,GetPtr2(test));
免费(测试);
返回0;
}
提前感谢您的帮助

unsigned char**GetPtr(unsigned char*ptr)
unsigned char ** GetPtr(unsigned char *ptr)
{
    return &ptr;
}               // <-- scope of ptr ends here
{ 返回&ptr;
}//试试这个:“unsigned char**GetPtr(unsigned char*ptr){return*ptr;}”我想要一个指向输入指针的指针,我不想取消引用它。指向输入指针的指针是无用的,因为它只是为函数调用而推到堆栈上的临时副本。程序打印什么?如果
GetPtr
为任何输入返回
NULL
,则您发布的代码与您正在编译的代码不匹配
GetPtr
永远不能像上面写的那样返回
NULL
&ptr
将如何导致NULL?无论
ptr
的值是什么,当它的地址被获取时,它仍然有一个非空的地址。@CareyGregory我想当到达printf语句时,内存可能已经被覆盖。请提供标准的参考。OP不取消对返回地址的引用,只打印返回值;AFAI不涉及UB。@IanM:不,这是不可能的,因为您无法访问任何超出生命的价值。我在你的代码中看不到这样做的原因。@CareyGregory,完成。谢谢你的坚持。经过反思,变量有一个已定义的地址,正如您所说,函数的返回值在调用点的作用域中。如果逻辑是
void*p=&ptr;返回p