-3

以下代码有什么问题

#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

4 回答 4

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

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

于 2013-09-18T13:57:24.760 回答
0

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

于 2013-09-18T13:53:40.697 回答
0

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

于 2013-09-18T13:54:29.303 回答
0

int a=10一旦调用pointer_return返回就会超出范围..

所以,*a会指向无效的内存


你应该这样做

int* pointer_return()
{
     int *a=malloc(sizeof(int));
     *a=10;
     return a;
}
于 2013-09-18T13:56:11.147 回答