2016-08-13 22 views
3

に初期化する構造体の内部の配列を設定しようとすると:は、私は、この構造体の定義を持っているC

typedef struct intArray 
{ 
    int myArray[1000]; 
} intArray; 

私の目標は、ゼロのintArrayを作成することです、私はこれを試してみました:

intArray example; 
int createArray[1000] = {0}; 
example.myArray = createArray; 

このこのエラーメッセージが表示されます:

error: assignment to expression with array type 

構造体を0に自動的に初期化するようにしたいが、それはいいえこれは型定義であり変数ではないため可能です。だから私は1つを作成し、配列を作成し、それを割り当てようとしたが、これが結果である。アドバイスをいただければ幸いです。

答えて

1

memsetを使用して配列をゼロにしてみませんか?また、別のユーザが示唆するように、このメモリをポインタに割り当てる方がいいでしょう。特に、関数間でその構造体を渡すつもりなら、特にそうです。

だけ考えたが、これは動作します:

typedef struct intArray { 
    int *myArray; 
} intArray; 

int main(void) 
{ 
    intArray a; 
    int b; 

    // malloc() and zero the array 
    //   
    // Heh...yeah, always check return value -- thanks, 
    // Bob__ - much obliged, sir. 
    //    
    if ((a.myArray = calloc(1000, sizeof *a.myArray)) == NULL) { 
     perror("malloc()"); 
     exit(EXIT_FAILURE); 
    } 

    memset(a.myArray, 0, (1000 * sizeof(int))); 

    // Fill the array with some values 
    // 
    for (b = 0; b < 1000; b++) 
     a.myArray[b] = b; 

    // Just to make sure all is well...yep, this works. 
    // 
    for (b = 999; b >= 0; b--) 
     fprintf(stdout, "myArray[%i] = %i\n", b, a.myArray[b]); 

    free(a.myArray); 

} 
+0

代わりに、 '' calloc() '](http://linux.die.net/man/3/calloc)を使うことを検討してください:' a.myArray = calloc(1000、sizeof * a.myArray); '。また、戻り値をチェックすることを忘れないでください。 –

+0

Dulyは、はるかにgracias。 – Nunchy

+0

Ehm、 'calloc()'を使用するポイントは、[既にすべてのビットをゼロにしています...](http://stackoverflow.com/a/1538427/4944425);) –

1

int myArray[1000];のような配列を宣言しても、配列ポインタの値を変更することはできません。可能であれば、あなたの構造体を宣言してください。

typedef struct intArray 
{ 
    int *myArray; 
} intArray; 

+0

をこれが与えられたエラーを避けるだろう、と思うが、それは潜在的に悪化し、実行時の問題のためにあなたを開きませんか?たとえば、配列をローカルに宣言してポインタに代入すると、配列が宣言されたスコープを終了すると、割り付けが解除され、そのメモリにアクセスしようとするとどうなるか分かりませんポインタ。 –

+0

スコープ外の配列にアクセスしたい場合は、最初に 'malloc'で宣言してはいけませんか? –

+0

しかし、この宣言(int * myArray)では、intの最大値を制御することはできません。私はそれを行う必要がありますし、構造体を作成したらmallocを使用してメモリを割り当てますか? – Eyzuky

関連する問題