从函数返回指针

时间:2011-10-13 13:38:36

标签: 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;
}   

4 个答案:

答案 0 :(得分:46)

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

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

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

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

答案 1 :(得分:17)

虽然返回一个指向本地对象的指针是不好的做法,但它并没有在这里引起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在堆上分配内存。

答案 2 :(得分:0)

在将值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);
}

答案 3 :(得分:-1)

据我所知,使用关键字new,与malloc(sizeof identifier)的功能相同。以下代码演示了如何使用关键字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;
}