在函数中传递2d数组 - 从C中的函数返回2d数组

时间:2014-09-20 19:40:11

标签: c arrays function 2d

所以我已阅读其他帖子,但我无法弄明白。我的代码如下,它工作正常。

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是错误的。那么为什么我的代码运行良好,哪种方式正确呢?

2 个答案:

答案 0 :(得分:1)

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

dist_table = sort(5, distortable);

使用:

sort(5, distortable);
在这种情况下,

通常会更好,虽然有时返回相同的值可能很有用(例如,如果你想在更大的表达式中使用它)。

对于问题的最后一部分,如果您实际拥有double **的二维数组,则传递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()的返回值,以确定分配是否成功。

答案 1 :(得分:0)

只要你知道阵列的深度和元素大小,你就会以正确的方式做到这一点。

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

相关问题