Как malloc "MyDef ** t" на определенную длину, вместо "MyDef * t [5]" в C - PullRequest
2 голосов
/ 27 октября 2010

Структура, подобная следующей, работает нормально, я могу использовать 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 ]

1 голос
/ 27 октября 2010
struct mystruct *s = malloc(sizeof(*s));
s->size = 5;
s->t = malloc(sizeof(*s->t) * s->size);
0 голосов
/ 27 октября 2010

Это происходит потому, что вы не выделяете память для самого массива, только для указателя на этот массив.

Итак, сначала вы должны выделить mystruct:

struct_instance = malloc(sizeof(mystruct));

и затем вам нужно выделить память для массива указателей на MyDef и инициализировать указатель в вашей структуре

struct_instance->size = 123;
struct_instance->t = malloc(sizeof(MyDef*) * struct_instance->size);
0 голосов
/ 27 октября 2010

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) 
...