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在堆上分配内存 .
39
在将值12赋值给整数指针时不分配内存 . 因此它崩溃了,因为它没有找到任何记忆 .
你可以试试这个:
#include<stdio.h>
#include<stdlib.h>
int *fun();
int main()
{
int *ptr;
ptr=fun();
printf("\n\t\t%d\n",*ptr);
}
int *fun()
{
int ptr;
ptr=12;
return(&ptr);
}
4 回答
在使用指针之前分配内存 . 如果你没有分配内存
*point = 12
是未定义的行为 .你的
printf
也错了 . 您需要取消引用(*
)指针 .虽然返回一个指向本地对象的指针是不好的做法,但它并没有在这里引起kaboom . 这就是你遇到段错误的原因:
本地指针超出范围,但真正的问题是取消引用从未初始化的指针 . 点的 Value 是多少?谁知道 . 如果该值未映射到有效的内存位置,您将获得SEGFAULT . 如果幸运的是它映射到有效的东西,那么你只是通过用你的任务覆盖那个地方来破坏你的内存 .
由于返回的指针立即被使用,在这种情况下,您可以放弃返回本地指针 . 但是,这是不好的做法,因为如果在另一个函数调用重用堆栈中的内存之后重用该指针,则程序的行为将是未定义的 .
或几乎完全相同:
另一个不好的做法,但更安全的方法是将整数值声明为静态变量,然后它不会在堆栈上,并且可以安全地被另一个函数使用:
要么
正如其他人所提到的,“正确”的方法是通过malloc在堆上分配内存 .
在将值12赋值给整数指针时不分配内存 . 因此它崩溃了,因为它没有找到任何记忆 .
你可以试试这个:
据我所知,使用关键字new,与malloc(sizeof identifier)的功能相同 . 下面的代码演示了如何使用关键字new .