以下代码存在的问题
#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
答案 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;
}