【问题标题】:Return of int** function in c在 c 中返回 int** 函数
【发布时间】:2018-05-30 11:37:00
【问题描述】:

我正在努力使用函数 int** Solve()。我在任何地方都没有找到解决方案,或者我无法准确地表达我的问题。我无法返回正确的值,我总是得到编译器错误或分段错误。如何初始化我想从函数返回的int ptr**?请注意,函数类型 (int**) 已给出,我无法更改它。我尝试使用 calloc,因为如果我想返回一些 line int ptr[4][4],它说我正在返回局部变量。我不知道该怎么做,而且 ptr 不一定是 int** 也许。我只想返回正确的元素并使用返回 ptr。我的代码:

int** Solve(){
    int array[6][6];

    //some determining of array's elements...

    int **ptr=calloc(4,sizeof(int*));
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            ptr[i][j]=array[i+1][j+1];
        }
    }

    return ptr;
}

【问题讨论】:

  • int** 将是交错数组而不是多维数组。您的 calloc 调用分配了一个指针数组,但您没有分配这些子数组。请注意,C 中的交错数组是一个坏主意,除非您真的需要一个“非矩形大小”的缓冲区,因为内存碎片风险增加并且需要 free 所有子数组。单独返回int**而不指明缓冲区的长度意味着消费者将无法正确地free
  • 自从我完成 som C 以来已经有一段时间了,但是,我觉得你搞砸了你的 **ptr,你允许他在 int int* 上有 4 个指针,但那些没有分配要接收整数,您还需要为这些指针中所需的整数分配空间。
  • @AugustKarlstrom 如果我只是通过初始化创建二维数组,我不能返回它,因为它被认为是局部变量。而且,int **solve() 给了我,我不能改变它。如果您的意思有所不同,请尝试分享示例代码以让我更好地理解。谢谢你:)
  • @victory 没关系,我错了。在 C 中,您不能定义一个函数,该函数采用任意大小(二维)的二维数组。

标签: c arrays pointers


【解决方案1】:

我会在您的问题下添加评论,但我缺乏声誉。

int r = 3, c = 4, i, j, count;

int **arr = (int **)malloc(r * sizeof(int *));
for (i=0; i<r; i++)
     arr[i] = (int *)malloc(c * sizeof(int));

这就是二维数组分配的样子。

malloc 和 calloc 之间的区别在于 calloc 对分配的内存进行零初始化,因此在您的情况下它们可以互换。

【讨论】:

  • 这不是二维数组。见Correctly allocating multi-dimensional arrays
  • 解决了这个问题。您能否也澄清一下,为什么 r=3 和 c=4?如果我使用 4x4 2D 数组,应该如何?
  • r 和 c 是行和列:p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2018-11-19
  • 1970-01-01
相关资源
最近更新 更多