【问题标题】:Pass 2d array in function - return 2d array from a function in C在函数中传递二维数组 - 从 C 中的函数返回二维数组
【发布时间】:2014-09-20 19:40:10
【问题描述】:

所以我已经阅读了其他线程,但我无法弄清楚。我的代码如下,它工作正常。

double **sort(int counter, double **a){
    int i, j;
    double swap0, swap1;

    for (i = 0 ; i < ( counter - 1 ); i++){
        for (j = 0 ; j < counter - i - 1; j++){
            if (a[0][j] > a[0][j+1]){
                swap0 = a[0][j];
                swap1 = a[1][j];
                a[0][j] = a[0][j+1];
                a[1][j] = a[1][j+1];
                a[0][j+1] = swap0;
                a[1][j+1] = swap1;
            }
        }
    }

    return a;
}

main(){

    double **dist_table;
    int i;

    dist_table = (double **)calloc(2,sizeof(double*));
    dist_table[0] = (double *)calloc(5,sizeof(double));
    dist_table[1] = (double *)calloc(5,sizeof(double));

    dist_table[0][0] = 5.1;
    dist_table[1][0] = 0;
    dist_table[0][1] = 6.1;
    dist_table[1][1] = 1;
    dist_table[0][2] = 3.1;
    dist_table[1][2] = 2;
    dist_table[0][3] = 2.1;
    dist_table[1][3] = 3;
    dist_table[0][4] = 7.1;
    dist_table[1][4] = 4;

    dist_table = sort(5, dist_table);
}

但是我读到将 **a 作为参数传递是错误的。那么为什么我的代码运行良好,哪种方式是正确的呢?

【问题讨论】:

  • 您能指出您阅读该论点的来源吗?
  • @DhavalKapil eskimo.com/~scs/cclass/int/sx9a.html 我知道这太老了,但最后它说这个论点是错误的
  • @user3143155:该页面正在讨论多维数组,这不是您在这里所拥有的。您在这里拥有的是一个一维(动态分配的)指针数组,其中的每个元素都指向另一个由doubles 构成的一维(动态分配)数组。实际的多维数组在内存中的表示方式与此不同,这正是链接页面说不要混淆它们的原因。
  • 是的@PaulGriffiths 是对的。

标签: c arrays function 2d


【解决方案1】:

您的函数只是返回您传递给它的相同指针。替换:

dist_table = sort(5, distortable);

与:

sort(5, distortable);

在这种情况下通常会更好,尽管有时返回相同的值可能很有用(例如,如果您想在更大的表达式中使用它)。

对于您问题的最后一部分,如果您实际上有一个二维数组 doubles,则传递 double ** 将是错误的,如下所示:

double my_array[2][5];

但这不是你所拥有的。您有一个double * 的一维(动态分配)数组,其中每个元素都指向一个double 的一维(动态分配)数组。实际的多维数组在内存中的表示方式与此不同,这就是为什么传递 double ** 不起作用的原因。但是你在这里实际拥有的是完全不同的,在这里传递一个double ** 很好。

其他不相关的点...

calloc() 转换返回是完全没有必要的,并且通常被认为是错误的形式。更好的是:

dist_table = calloc(2,sizeof(double*));
dist_table[0] = calloc(5,sizeof(double));
dist_table[1] = calloc(5,sizeof(double));

或者更好:

dist_table =  calloc(2,sizeof *dist_table);
for ( int i = 0; i < 2; ++i ) {
    dist_table[i] = calloc(5,sizeof *(dist_table[i]));
}

别忘了检查calloc()的返回值,看看分配是否成功。

【讨论】:

    【解决方案2】:

    只要您知道数组的深度和元素大小,您就可以正确地进行操作。

    如果元素的数量是动态的且不限于两个,则考虑使用 null 终止数组。

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 2021-12-04
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2014-12-19
      • 1970-01-01
      相关资源
      最近更新 更多