我需要传递引用子数组,这些子数组是动态分配的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;
}
答案 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返回的地址存储在我们获取的地址作为参数。所以我们取消引用它并完全按照它做。