1

我需要通过引用子数组传递,这些子数组是动态分配的二维数组的一部分。我尝试了以下方法,这似乎不起作用。如果可能的话,有什么想法吗?

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;
}
4

2 回答 2

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]);
}

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

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

于 2012-08-12T22:45:46.217 回答
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 返回的地址存储在我们作为参数获得的地址中。所以我们取消引用它并做到这一点。

于 2012-08-12T23:17:04.427 回答