2016-07-22 8 views
1

可変長配列を含む構造体を初期化する方法があるかどうか分かっていますか?別の変数で配列を初期化せずに(mallocを使わずに) 。可変長配列を持つ構造体をCで初期化する

void my_function (int size) { 
    int values[size]; 
    struct my_struct mystr = { 
     .values = values, 
     .size = size 
    }; 
    ... 
} 

(アレイは、その後、構造、最初に初期化される。これは、働いているが、それは厄介になります。私がいることを持っている私のコードでは今のところ

struct my_struct { 
    int *values; 
    int size; 
} 

私の構造は、このようになります配列の別の変数を宣言することができます。

これはおそらくうまくいくでしょう:

void my_function (int size) { 
    struct my_struct mystr = { 
     .values = calloc (size, sizeof (int)), 
     .size = size 
    }; 
    ... 
} 

(私はmallocをを使用したくない)

しかし、私が書きたいことのようなものです:

void my_function (int size) { 
    struct my_struct mystr = { 
     .values = (int[size]){}, 
     .size = size 
    }; 
    ... 
} 

任意のアイデア?

+1

スペースを割り当てることなく配列を使用したいですか? – GMichael

+0

私は配列のためのスペースを割り当てる必要があることを知っていますが、 'int values [size];'のような中間変数を使わずにしたいと思います。 – FClad

+0

'.values = calloc(size、sizeof(int))の何が問題なのですか? – GMichael

答えて

3

まず構造体を返す場合は、スタックから配列を使用できないことに注意してください。

int values[size]; 
struct my_struct mystr = { 
    .values = values, 
    .size = size 
}; 
return mystr; 

これは、あなたが戻ったときvaluesの寿命が終了したので、仕事に行くのではありません。ファンクションのパラメータで指し示された値にmystrを格納しようとした場合も同様です。

明らかにあなたはそれをやっていませんが、とにかく言及する価値はあると思います。


あなたの質問への回答:状況によって異なります。

sizeは小さいですか?または、スタックがint values[size]にオーバーフローする可能性があります。それは小さくて予測可能ですか?あなたの最初の解決策に固執してください。ユーザーの入力に大きく依存する場合は、間違いなくmallocを使用してください。

構造や値に永続的なポインタを戻したり保持したりしていますか? mallocを使用してください(私の最初の発言を見てください)。

また、struct hackを使用することもできますが、とにかくにする必要があります。とにかくmystrです。


もう一つ、あなたが書いた:

を(配列は、これが機能していますが、 、それは配列のために別の変数を宣言するために厄介に見えるその後、構造、最初に初期化されます。)

私はあなたが何を意味するかわからないんだけど、int *は、配列のサイズの唯一sizeof(intptr_t)、関わらずです。つまり、1つの配列に2倍のメモリを割り当てているわけではありません。

+1

'sizeof(int *)'は 'sizeof(intptr_t)'と必ずしも同じではありません。私はあなたがその点を逃したと思う。 OPはこの問題のパフォーマンスやメモリの使用には関係しません。彼/彼女はより表情豊かになりたいと思っています...これらの2つの概念は直交しています。 – Sebivor

-1

初期化子は、初期化子リストによって初期化された名前のないオブジェクトです。関数の本体の外側では、オブジェクトは静的な記憶期間を持ちます。したがって、そのようなオブジェクトのアドレスを使用することは可能です。 Variadicマクロの助けを借りて試してみてください→

#include <stdio.h> 

struct test { 
    int count; 
    int *values; 
} test[] = { 
#define init(...) { .count=sizeof((int[]) {__VA_ARGS__})/sizeof(int), .values=(int *)&(int []){__VA_ARGS__} } 
       init(0,1,2,3,4), 
       init(2,4,6,8), 
       init(1,3), 
       init(42) 
      }; 
#define test_size ((int) (sizeof test/sizeof *test)) 

int main(void) 
{ 
    for(int array=0; array<test_size; ++array) { 
    printf("array %d (%d) : [ ", array+1, test[array].count); 
    for(int i=0; i<test[array].count; ++i) 
     printf("%d ", test[array].values[i]); 
    puts("]"); 
    } 
    return 0; 
} 
関連する問題