2012-03-22 30 views
3

我有一个结构,看起来像这样:如何在结构中分配固定大小的二维数组?

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故障。

如果我不是在声明该结构中的载体:

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); 
} 

然后一切工作正常。由于第一个和第二个向量的大小是固定的,并且在编译时已知,所以似乎很奇怪我必须为它们单独分配内存。有没有办法在结构中声明它们,这样我就可以malloc一个新的结构,而不需要分别为每个向量分配内存?

+0

第二个代码段是否是错字? 'mystruct * struct'没有意义。 – Collin 2012-03-22 20:02:09

+0

不,它只是真的不清楚(struct应该是变量的名字......)我已经更新了。 – 2012-03-22 20:45:48

+0

您修正了其中一个拼写错误,但'sizeof my_struct'应该由'sizeof(my_struct)'。 – 2012-03-22 20:50:48

回答

3

你有什么应该罚款..除了在my_struct * struct = malloc...这个小测试案例的顶部和奇声明时髦的typedef工作对我来说:

#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的段错误的可能来源) – 2015-05-01 20:42:35