如何通过引用传递动态分配的2D数组中的子数组?

时间:2012-08-12 22:41:46

标签: c pointers pass-by-reference

我需要传递引用子数组,这些子数组是动态分配的2D数组的一部分。我尝试了以下方法,似乎不起作用。任何想法,如果有可能吗?

void set1(int *a){
    a = malloc(2*sizeof(int));
    a[0] = 5;
    a[1] = 6;
}

void set2(int *a){
    a = malloc(2*sizeof(int));
    a[0] = 7;
    a[1] = 8;
}

int main(){
    int **x = malloc(2*sizeof(int*));

    set1(x[0]);   
    set2(x[1]);

    return 0;
}

2 个答案:

答案 0 :(得分:4)

您需要传递子阵列的地址,如下例所示:

void set(int ** a)
{
    *a = malloc(2 * sizeof(int));
    (*a)[0] = 4;
    (*a)[1] = 9;
}

int main(void)
{
    int ** x = malloc(2 * sizeof(int*));
    set(&x[0]);
    set(&x[1]);
}

每当你有一个需要修改调用者范围内某个函数的函数时,你需要在函数中取消引用(比如我们的*a)和调用者中的地址(如&x[0]

(相比之下,您的代码将指向已分配内存的指针分配给局部变量(即myArray),该函数在函数返回时丢失。并且内存随之丢失。)

答案 1 :(得分:1)

#include <stdlib.h>
#include <stdio.h>

void testFunc1(int** a){
    *a = malloc(2*sizeof(int));
    (*a)[0] = 5;
    (*a)[1] = 6;
}

void testFunc2(int** a){
    *a = malloc(2*sizeof(int));
    (*a)[0] = 7;
    (*a)[1] = 8;
}

int main(){
    int** x = malloc(2*sizeof(int*));

    set1(&x[0]);   
    set2(&x[1]);

    printf("value:%d\n", x[0][0]);
    printf("value:%d\n", x[0][1]);
    printf("value:%d\n", x[1][0]);
    printf("value:%d\n", x[1][1]);
    return 0;
}

输出:

value:5
value:6
value:7
value:8

可视化工作:

x   -->       x[0]   |   x[1]
              |            |
              \/           \/
               ?            ?

您想要更改x [0](x [1])指向的地址。对于能够将其更改为真实的函数,您必须传递x [0](x [1])作为参考。由于x [0](...)是一个指向int的指针(即int *),函数的参数应该是一个指向int(即int类型**)的指针来实现这一点(在C中) 。因此,我们使用地址x [0]调用set1。在set1中,我们希望将malloc返回的地址存储在我们获取的地址作为参数。所以我们取消引用它并完全按照它做。