从c中的函数返回指针

时间:2013-09-18 13:51:44

标签: c

以下代码存在的问题

#include<stdio.h>

int main()
{
    int *a=pointer_return();

}

int* pointer_return()
{
     int a=10;
    return &a;
}

它给了我错误

demo.c: In function ‘main’:
demo.c:5:9: warning: initialization makes pointer from integer without a cast [enabled by default]
demo.c: At top level:
demo.c:9:6: error: conflicting types for ‘pointer_return’
demo.c:5:9: note: previous implicit declaration of ‘pointer_return’ was here

4 个答案:

答案 0 :(得分:8)

发生了实际的错误,因为您在尝试使用它之后声明了pointer_return。所以C编译器在引用它时不知道它是什么。如果更改顺序,则编译器会理解pointer_return声明中对int *a...的引用:

int* pointer_return()
{
     int a=10;
    return &a;
}

int main()
{
    int *a=pointer_return();
}

或通过以下方式解决:

int* pointer_return();

int main()
{
    int *a=pointer_return();
}

int* pointer_return()
{
    int a=10;
    return &a;
}

错误将消失,但你仍然会收到关于返回局部变量地址的警告,正如大家所指出的那样。如果稍后取消引用返回值,则返回局部变量的地址将导致未定义的行为。

答案 1 :(得分:0)

返回指针的变量位于堆栈上,这意味着一旦函数返回,它就变为无效/非法引用它。

答案 2 :(得分:0)

问题是您要返回局部变量的地址。一旦函数超出范围,变量就会超出范围,其地址变得毫无意义。因此,您的指针将保存无效的地址。

答案 3 :(得分:0)

一旦对int a=10的调用返回,

pointer_return就会超出范围。

因此,*a会指向无效的内存


你应该这样做

int* pointer_return()
{
     int *a=malloc(sizeof(int));
     *a=10;
     return a;
}