0

内部にint配列を持つ構造体があり、配列を初期化するために関数に渡しています

そのような配列構造..

typedef struct Container{
    struct intArray *P;
    int length;
} Container;

typedef struct intArray{
    int *array;
    int length;
} intArray;

そのように配列を初期化する関数...

int Initializer(intArray *myStruct, int n)
{
    myStruct->array = malloc(sizeof(int) * (lengthOfint);
                                              ^
                                        If n=55 then length would be 2
    //let's just say n=5
    myStruct->array[0] = n;

    //return 1 if successful
    return 1;
}

別の関数では、イニシャライザ関数を次のように呼び出しています...

Container *myContainer = malloc(sizeof(Container));

myContainer->P = malloc(sizeof(intArray *) * Some_Defined_Value);

Initializer(&myContainer, 5);

printf("the data that should be at index 0 -> %d\n", myContainer->P.array[0];

printf ステートメントは 5 を出力すると思いますが、コンパイルするたびにさまざまな数のガベージを出力します。構造体のアイデア内の構造体内の配列を把握しているとは思いません。

4

3 に答える 3

1

コンテナーを初期化関数に渡しますが、よく見ると、目的の へのポインターではなく、「外側の」コンテナーへのポインターへのポインターを渡していることがわかりますstruct intArray。あなたは次のようなものが欲しいでしょうInitializer(myContainer->P, 5);

于 2013-06-12T23:30:51.310 に答える
0

Containerへのポインタを保持しますstruct intArray。この場合、これは の配列の先頭ですstruct intArray。ただし、このポインターを次のように初期化します

malloc(sizeof(intArray *) * Some_Defined_Value);

したがって、 malloc は、ポインタを保持するメモリ空間へのポインタ返しstruct intArrayます。sizeof(intArray *)sizeof(intArray)Some_Defined_Value

ここで、 の数にsizeof(intArray) * Some_Defined_Valueスペースを割り当てる必要があります。Some_Defined_Valuestruct intArray

次に、使用します

Initializer(&myContainer, 5);

へのポインターへのポインターを渡すため、少なくとも警告を表示する必要がありますstruct Containerが、へのポインターInitializer期待しているため、これはあなたが望むものではありません。の使用の配列の最初の要素を初期化するには:struct intArraystruct intArray

Initializer(&(myContainter->P[0]), 5);

それで:

printf("the data that should be at index 0 -> %d\n", myContainer->P.array[0]));

このコードは次のようになるため、コンパイルされません。

printf("the data that should be at index 0 -> %d\n", myContainer->P[0].array[0]);

myContainer->Pへのポインタにアクセスしますstruct intArray。上のコードは、 の配列の最初の要素 (要素番号 0) にアクセスすることを意味しますstruct intArray

の配列の 2 番目の要素を初期化/アクセスするには、次のようにstruct intArray使用します。

Initializer(&(myContainter->P[1]), 5);
printf("the data that should be at index 0 -> %d\n", myContainer->P[1].array[0]);
于 2013-06-13T00:28:11.117 に答える
0

また、ほとんどの場合、次のようなキャストが必要になるので、をmalloc返すことに注意してください。void *

myStruct->array = (int*)malloc(sizeof(int) * (length);
//                ^^^^^^

は、配列に格納する int の数であると仮定lengthします。

于 2013-06-12T23:43:54.630 に答える