首页 文章

从函数返回指针

提问于
浏览
25

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

#include<stdio.h>
int *fun();
main()
{
    int *ptr;
    ptr=fun();
    printf("%d",*ptr);

}
int *fun()
{
    int *point;
    *point=12;  
    return point;
}

4 回答

  • 0

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

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

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

    printf("%d", *ptr);
                 ^
    
  • -1

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

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

    本地指针超出范围,但真正的问题是取消引用从未初始化的指针 . 点的 Value 是多少?谁知道 . 如果该值未映射到有效的内存位置,您将获得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在堆上分配内存 .

  • 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);
    }
    
  • 17

    据我所知,使用关键字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;
    }
    

相关问题