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

我需要传递引用子数组,它是动态分配的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; } 

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

 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 ),该函数在函数返回时丢失。并且内存随之丢失。)

 #include  #include  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返回的地址存储在我们获取的地址作为参数。 所以我们取消引用它并做到这一点。