Как malloc "MyDef ** t" на определенную длину, вместо "MyDef * t[5]" в C
Структура, подобная следующей, прекрасно работает, я могу использовать t после вызова malloc(sizeof(mystruct)):
struct mystruct {
MyDef *t[5];
};
Я хочу иметь возможность динамически устанавливать длину массива MyDef, как показано ниже:
struct mystruct {
MyDef **t;
int size;
};
Что мне нужно сделать дополнительно к malloc(sizeof(mystruct)), чтобы заставить это работать, чтобы я мог сделать TestStruct->t[3] = что-то? Просто получаю ошибку сегментации!
Спасибо!
РЕДАКТИРОВАТЬ с кодом, который вызывает ошибку сегмента, если только я не слепой, кажется, что ответы таковы:
#include <stdio.h>
typedef struct mydef {
int t;
int y;
int k;
} MyDef;
typedef struct mystruct {
MyDef **t;
int size;
} MyStruct;
int main(){
MyStruct *m;
if (m = (MyStruct *)malloc(sizeof(MyStruct)) == NULL)
return 0;
m->size = 11; //seg fault
if (m->t = malloc(m->size * sizeof(*m->t)) == NULL)
return 0;
return 0;
}
3 ответа
m = (MyStruct*)malloc(sizeof(MyStruct)) == NULL
Что это делает Вызывает malloc, сравнивает возврат malloc с NULL. Затем присваивает результат этого сравнения (логическое значение) для m.
Это происходит потому, что "==" имеет более высокий приоритет, чем "=".
То, что ты хочешь:
if ( (m = (MyStruct *)malloc(sizeof(MyStruct))) == NULL)
...
if ( (m->t = malloc(m->size * sizeof(*m->t))) == NULL)
struct mystruct *s = malloc(sizeof(*s));
s->size = 5;
s->t = malloc(sizeof(*s->t) * s->size);
Это происходит потому, что вы не выделяете память для самого массива, только для указателя на этот массив.
Итак, сначала вы должны выделить mystruct:
struct_instance = malloc(sizeof(mystruct));
а затем вы должны выделить память для массива указателей на MyDef и инициализировать указатель в вашей структуре
struct_instance->size = 123;
struct_instance->t = malloc(sizeof(MyDef*) * struct_instance->size);