2012-03-22 9 views
3

私はこのようになります構造体があります。私がやりたい構造体に固定サイズの2次元配列を割り当てるにはどうすればよいですか?

typedef struct _my_struct { 
    float first_vector[SOME_NUM][OTHER_NUM]; 
    float second_vector[SOME_NUM][OTHER_NUM]; 
    int some_val; 
} my_struct; 

を:

my_struct * thing = (my_struct *)malloc(sizeof(my_struct)); 

しかし、私はそうしてからのベクトルで何かをアクセスしようとすると、私を得ますseg fault。

私が代わりとして構造体のベクトルを宣言する場合:

typedef struct _my_struct { 
    float **first_vector; 
    float **second_vector; 
    int some_val; 
} my_struct; 

、その後に割り当てる:

my_struct->first_vector = (float**)malloc(sizeof(float*) * SOME_NUM); 
my_struct->second_vector = (float**)malloc(sizeof(float*) * SOME_NUM); 
int i; 
for (i = 0; i < SOME_NUM; i++){ 
    my_struct->first_vector[i] = (float*)malloc(sizeof(float) * OTHER_NUM); 
    my_struct->second_vector[i] = (float*)malloc(sizeof(float) * OTHER_NUM); 
} 

その後、すべてが正常に動作します。

第1および第2のベクトルはサイズが固定されており、コンパイル時には既知であるため、個々にメモリを割り当てなければならないのは奇妙なことです。構造体でそれらを宣言する方法はありますか?それで、各ベクトルに別々にメモリを割り当てずに新しい構造体をmallocできるだけですか?

+0

2番目のコードスニペットはタイプミスですか? 'mystruct * struct'は意味がありません。 – Collin

+0

いいえ、それは本当に不明でした(構造体は変数の名前であるはずです...)私は更新しました。 –

+0

あなたはタイプミスを修正しましたが、 'sizeof my_struct'は' sizeof(my_struct) 'によって行うべきです。 –

答えて

3

何を持っていることは問題ないはずです。..脇上部にファンキーのtypedefとmy_struct * struct = malloc...の奇数宣言からこの小さなテストケースは私の作品:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    float first[10][20]; 
    float second[10][20]; 
    int val; 
} my_struct; 

int main(void) { 
    printf("Sizeof mystruct %d\n", sizeof(my_struct)); 

    my_struct* str = malloc(sizeof(my_struct)); 
    if(!str) { 
     printf("Memory allocation error!"); 
     exit(1); 
    } 

    str->first[0][0] = 1; 
    str->second[1][19] = 15; 

    printf("values %f %f\n", str->first[0][0], str->second[1][19]); 

    free(str); 

    return 0; 

} 

出力は次のとおりです。

Sizeof mystruct 1604 
values 1.000000 15.000000 

さらに、mallocの戻り値をキャストすべきではありません。重要なコンパイラの警告を隠すことができます。

+0

逆参照の前に 'str'が' NULL'でないことを確認する必要があります(これはOPのsegfaultのソースになります) –

関連する問題