malloc в c, структура - PullRequest
       20

malloc в c, структура

1 голос
/ 14 декабря 2011

Я сделал такую ​​структуру:

struct a{
  char *name;
  char *value;
  struct a *next;
};

когда я в первый раз использую malloc для памяти, это нормально, и я могу установить 'name' и 'value' соответствующее значение. но когда я malloc во второй раз, приходят ошибки. И это CGI, просто покажи мне "500 Внутренняя ошибка сервера".

Я изменил указатель 'name' и 'value' на массив, все работает.

Я подумал, что, возможно, компилятор не знает, сколько памяти выделить.

А у вас есть идеи по этому поводу? Буду признателен за каждый ответ!

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011
struct a {
    char *name;
    char *value;
    struct a *next;
};

struct a *head = malloc(sizeof *head);

Выше выделено место для одного struct a объекта, но он не инициализирует ни один из трех указателей, содержащихся в struct a.В частности, если вы хотите, чтобы name и value указывали на строки, вам нужно выделить место для этих строк:

head->name = malloc(5);
strcpy(head->name, "Fred");
head->value = malloc(8);
strcpy(head->value, "abcdefg";

Это значительно упрощено.5 и 8 - «магические числа»;Вы должны указать размеры таким образом, чтобы они оставались неизменными при изменении начальных значений.И вы должны всегда проверять, возвращает ли malloc() нулевой указатель (даже если вы просто завершаете программу с сообщением об ошибке).

Если вы не инициализируете name и value чтобы указать на какой-то фрагмент выделенной памяти, вы могли бы по-прежнему иметь возможность инициализировать то, на что они указывают (например, выполнив strcpy с без malloc с).Точнее, система не обязательно диагностирует ошибку.

Наконец, вам потребуется вызов free(), соответствующий каждому вызову malloc().

Обратите внимание, что это в значительной степенипредположение на основе вашего описания.Если вы покажете нам свой реальный код, мы сможем помочь вам лучше.

2 голосов
/ 14 декабря 2011

Если вы используете malloc с sizeof(struct a), то просто выделите достаточно места для хранения имени и значения указателей.Вы хотите, чтобы они были массивами символов, тогда он будет знать, сколько места нужно выделить для каждого экземпляра a.

...