Я использую следующую функцию
int parse_headers(char *str, struct net_header *header)
{
char *pch;
struct net_header *h, *temp;
pch = strtok(str, "\n");
header->name = pch;
h = malloc(sizeof(struct net_header));
header->next = h;
while ((pch = strtok(NULL, "\n")) != NULL)
{
h->name = pch;
temp = malloc(sizeof(struct net_header));
h->next = temp;
h = temp;
}
return N_SUCCESS;
}
Вплоть до строки header->next = h
все работает по плану. Однако после строки h = malloc(sizeof(struct net_header));
переменные pch
и str
почему-то превращаются в NULL
(чтобы найти это, я поставил точки останова). После строки temp = malloc(sizeof(struct net_header));
header
также превращается в NULL
. Очевидно, у меня есть какая-то проблема с управлением памятью, но я не могу найти, что это такое. Аргумент header
инициализируется таким образом непосредственно перед вызовом функции
header = malloc(sizeof(struct net_header));
struct net_header
объявлен как
struct net_header
{
char *name;
char *content;
struct net_header *next;
};
Я запустил статический анализатор Xcode, который не обнаружил проблем. У меня также нет предупреждений или ошибок компилятора. Я запускаю эту программу на Mac OS X 10.9.
Почему мои переменные обнуляются после вызова malloc()
?
2 ответа
Если вам нужно сохранить результат strtok, вы должны его дублировать, например, strdup
int parse_headers(char *str, struct net_header *header)
{
char *pch;
struct net_header *h, *temp;
pch = strtok(str, "\n");
header->name = strdup(pch);
h = malloc(sizeof(struct net_header));
header->next = h;
while ((pch = strtok(NULL, "\n")) != NULL)
{
h->name = strdup(pch);
temp = malloc(sizeof(struct net_header));
h->next = temp;
h = temp;
}
return N_SUCCESS;
}
Вам нужно позвонить free
где-нибудь, чтобы освободить память
str
может быть изменен, и вы хотите, чтобы header->name
не зависел от str
. Пока это не имеет никакого отношения к его проблеме.
Я попытался воспроизвести вашу ошибку, работая на Mac OS X 10.10, и с вашим кодом проблем нет, он работает отлично.
Ваша проблема возникает из-за другого вызова malloc()
с неправильным размером, как в этом сообщении и в этот, обычно вызванный передачей размера указателя вместо реального размера типа переменной.
Я не могу сказать вам, где, так как я не вижу весь ваш код, работающий до этого «плохого вызова», и я не мог спросить в комментариях, потому что у меня недостаточно прав.
Надеюсь, это поможет.
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
header->next = h;
будет проблемой, еслиheader
равно NULL. Насколько вы уверены, чтоheader
не равно NULL?malloc
он содержит строку ("foo"
), но после вызова этоNULL
, так что я бы сказал самstr
.header
указывает на допустимый объект, и его значениеname
установлено правильно.malloc()
. Если вы получаете подобное поведение (переменные изменяются произвольно), вы страдаете от повреждения стека.