2011-12-14 2 views
1

Я сделал-структуру, как это:таНос в с, структура

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

, когда я таНос на память в первый раз, это нормально, и я могу установить «имя» и «значение» соответствующее значение. но когда я malloc во второй раз, приходят ошибки. И это cgi, просто покажите мне «500 Internal server error».

Я изменил указатель «имя» и «значение» на массив, все работает.

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

И у вас есть идеи с этим? Я буду благодарен за каждый ответ!

+5

Вам нужно будет показать больше кода - вы хранили непосредственно в значения 'a-> name' или' a-> value' или вы также выделили память для _them_? – sarnold

+0

Я храню значения непосредственно без выделения памяти. И как заметил Кейт Томпсон, я выделяю память для a-> name и a-> value, она работает. Ты знаешь разницу? Спасибо! – trinity

ответ

2

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

+0

спасибо, LaceySnr. вы понимаете лучше меня. Мне становится ясно. – trinity

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

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

выше выделяет пространство для одного struct a объекта, но не инициализирует любой из HTE трех указателей, содержащихся в 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().

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

+0

Да, ты прав. Я просто проверил ваш метод. Оно работает. Но еще один вопрос, когда вы используете 'head-> name = malloc (5)', вы должны знать размер, который вы хотите malloc. поэтому процесс: cacluate length, затем malloc. но я не думаю, что это эффективность. еще раз спасибо! – trinity

+0

Как вы рассчитываете, длина зависит от того, откуда поступают данные. Если у вас есть указатель 'char *', называемый 'name', который указывает на строку, которую вы хотите использовать в качестве имени, вы можете сделать' head-> name = malloc (strlen (name) + 1); if (head-> name == NULL) {/ * сбой выделения дескриптора * /} strcpy (head-> name, name); '. Например.(Символ '+ 1' необходим для хранения символа' '\ 0'' null, который завершает строку.) –

+0

здесь я хочу проанализировать строку qeury как« search = stackoverflow & keyword = malloc & language = en & else = null ». поэтому я не могу найти эффективный способ сделать это. – trinity

Смежные вопросы