我有一个看起来像这样的结构:
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 :(得分: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
输出是:
{{1}}
此外,您不应该转换malloc的返回值。它可以隐藏重要的编译器警告。