爱国者002
2017-07-22 10:39
采纳率: 72.2%
浏览 972
已采纳

C语言函数返回指针和数组的区别

我的函数返回一个二维数组如下:

 double** inverse(double (**data)) {
    double result[2][2];
    result[0][0] =  data[1][1] /  (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[0][1] = -data[0][1] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[1][0] = -data[1][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    result[1][1] = data[0][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);

    return result;
}

然后函数外面用一个二维指针去接:

    double** s = inverse(gama[FreIdx]);
    printf("%f\n", s[0][0]);

但是报错了,说s的内存地址无法访问。求解释一下,对C不是很熟

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • blownewbee 2017-07-23 14:12
    已采纳
     因为你返回的数组是局部变量,是定义在堆栈上的,出了函数,这些内存就被回收了。所以报错。
    而指针你是动态分配的,在堆上,是全局的,不会因为函数的退出而被回收。其实和指针没有关系,如果你返回的是全局的数组也是可以的,如果你返回的是局部变量的指针,也是不可以的。
    但是有个例外,如果不是数组,而是单个变量,因为c/c++编译器会自动复制过去,所以就没有问题。
    如下代码就没问题
    int foo()
    {
    int i = 1;
    return i;
    }
    
    点赞 打赏 评论
  • 57_Viking 2017-07-23 14:08

    你的result是在函数内申明,并开辟了空间,函数执行完后,生存周期结束,空间被释放了,只是返回了指针

    点赞 打赏 评论
  • 798VHS 2017-07-23 15:45

    result是定义在inverse函数内的局部变量,随着inverse建栈而建立,当inverse函数执行完后inverse函数所占用的内存随即被系统回收。

    由于inverse是定义在该函数的局部变量,所以该函数所占用的内存也将被回收,此时s变量得到了inverse函数return的result指针是指向已被回收的内存地址(即该地址指向的内存已经不再归该进程所有,该进程不得访问,否则将引发异常)


    解决方案之一:先修改inverse函数

    
    void  inverse(double (**data),double result[2][2]) 
    {
            result[0][0] =  data[1][1] /  (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
            result[0][1] = -data[0][1] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
            result[1][0] = -data[1][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
            result[1][1] = data[0][0] / (data[0][0] * data[1][1] - data[0][1] * data[1][0]);
    }
    
    

    然后调用inverse函数前定义个二维double数组,并将该数组传输inverse函数中

    
    double res[2][2];
    inverse(gama[FreIdx],res)
    
    printf("%lf\n",res[0][0]);
    
    
    点赞 打赏 评论

相关推荐 更多相似问题