use*_*879 33 c pointers segmentation-fault
我试图从函数返回指针.但我得到分段错误.有人请告诉代码有什么问题
#include<stdio.h>
int *fun();
main()
{
int *ptr;
ptr=fun();
printf("%d",*ptr);
}
int *fun()
{
int *point;
*point=12;
return point;
}
Run Code Online (Sandbox Code Playgroud)
cni*_*tar 47
在使用指针之前分配内存.如果你没有分配内存*point = 12
是未定义的行为.
int *fun()
{
int *point = malloc(sizeof *point); /* Mandatory. */
*point=12;
return point;
}
Run Code Online (Sandbox Code Playgroud)
你printf
错了.你需要取消引用(*
)指针.
printf("%d", *ptr);
^
Run Code Online (Sandbox Code Playgroud)
小智 19
虽然返回指向本地对象的指针是不好的做法,但它并没有在这里引起kaboom.这就是你遇到段错误的原因:
int *fun()
{
int *point;
*point=12; <<<<<< your program crashed here.
return point;
}
Run Code Online (Sandbox Code Playgroud)
本地指针超出范围,但真正的问题是取消引用从未初始化的指针.点的价值是多少?谁知道.如果该值未映射到有效的内存位置,您将获得SEGFAULT.如果幸运的是它映射到有效的东西,那么你只是通过用你的作业覆盖那个地方来破坏你的内存.
由于返回的指针立即被使用,在这种情况下,您可以放弃返回本地指针.但是,这是不好的做法,因为如果在另一个函数调用在堆栈中重用该内存之后重用该指针,则程序的行为将是未定义的.
int *fun()
{
int point;
point = 12;
return (&point);
}
Run Code Online (Sandbox Code Playgroud)
或几乎完全相同:
int *fun()
{
int point;
int *point_ptr;
point_ptr = &point;
*point_ptr = 12;
return (point_ptr);
}
Run Code Online (Sandbox Code Playgroud)
另一个不好的做法,但更安全的方法是将整数值声明为静态变量,然后它不会在堆栈上,并且可以安全地被另一个函数使用:
int *fun()
{
static int point;
int *point_ptr;
point_ptr = &point;
*point_ptr = 12;
return (point_ptr);
}
Run Code Online (Sandbox Code Playgroud)
要么
int *fun()
{
static int point;
point = 12;
return (&point);
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所提到的,"正确"的方法是通过malloc在堆上分配内存.