尽管返回指向本地对象的指针是不良实践,但它并没有引起错误。以下是你出现段错误的原因:
int *fun()
{
int *point;
*point=12; <<<<<< your program crashed here.
return point;
}
本地指针超出作用域,但真正的问题是对未初始化的指针进行解引用。指针变量point的值是多少?谁知道呢。如果该值没有映射到有效的内存位置,则会出现SEGFAULT错误。如果它偶然映射到某个有效位置,那么通过将该位置赋值为12来覆盖该位置,你刚刚破坏了内存。
由于返回的指针被立即使用,在这种情况下,可以返回本地指针。然而,这是一种不良的实践,因为如果该指针在另一个函数调用重新使用该栈内存后被重复使用,程序的行为将是未定义的。
int *fun()
{
int point;
point = 12;
return (&point);
}
或者几乎相同:
int *fun()
{
int point;
int *point_ptr;
point_ptr = &point;
*point_ptr = 12;
return (point_ptr);
}
另一个不好的做法但更安全的方法是将整数值声明为静态变量,这样它就不会在堆栈上,并且不会被另一个函数使用:
int *fun()
{
static int point;
int *point_ptr;
point_ptr = &point;
*point_ptr = 12;
return (point_ptr);
}
或者
int *fun()
{
static int point;
point = 12;
return (&point);
}
正如其他人所提到的,做这件事的“正确”方式是通过malloc在堆上分配内存。
malloc
和*ptr = 12
的方式有什么区别?为什么前者即使在发送方本地声明,也会向调用者返回有效指针,而后者却不会呢? - SexyBeastmalloc
表示“我需要一些内存来存储东西”,但是普通的*ptr = 12
表示“我需要一些内存来进行计算,以后还可以用于其他事情”。 - wizzwizz4