1

動的に割り当てられた 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;
}
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) と呼び出し元の address-of が必要です ( のように&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 に答える