Как 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);
Другие вопросы по тегам