从函数返回指针

我试图从函数返回指针。 但我得到了分段错误。 有人请说出代码有什么问题

#include int *fun(); main() { int *ptr; ptr=fun(); printf("%d",*ptr); } int *fun() { int *point; *point=12; return point; } 

在使用指针之前分配内存。 如果你没有分配内存*point = 12是未定义的行为。

 int *fun() { int *point = malloc(sizeof *point); /* Mandatory. */ *point=12; return point; } 

你的printf也错了。 您需要取消引用( * )指针。

 printf("%d", *ptr); ^ 

虽然返回一个指向本地对象的指针是不好的做法,但它并没有在这里引起kaboom。 这就是你遇到段错误的原因:

 int *fun() { int *point; *point=12; <<<<<< your program crashed here. return point; } 

本地指针超出范围,但真正的问题是取消引用从未初始化的指针。 点的价值是多少? 谁知道。 如果该值未映射到有效的内存位置,您将获得SEGFAULT。 如果幸运的是它映射到有效的东西,那么你只是通过用你的任务覆盖那个地方来破坏你的内存。

由于返回的指针立即被使用,在这种情况下,您可以放弃返回本地指针。 但是,这是不好的做法,因为如果在另一个函数调用重用堆栈中的内存之后重用该指针,则程序的行为将是未定义的。

 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在堆上分配内存。

据我所知,使用关键字new,与malloc(sizeof identifier)的function相同。 下面的代码演示了如何使用关键字new。

  void main(void){ int* test; test = tester(); printf("%d",*test); system("pause"); return; } int* tester(void){ int *retMe; retMe = new int;//<----Here retMe is getting malloc for integer type *retMe = 12;<---- Initializes retMe... Note * dereferences retMe return retMe; } 

在将值12赋值给整数指针时不分配内存。 因此它崩溃了,因为它没有找到任何记忆。

你可以试试这个:

 #include #include int *fun(); int main() { int *ptr; ptr=fun(); printf("\n\t\t%d\n",*ptr); } int *fun() { int ptr; ptr=12; return(&ptr); }