Допустим у нас есть:Использование strdup()
-структуруstruct Person {
char *name;
};
struct Person *Person_create(char *name){
struct Person *who = malloc(sizeof(struct Person));
assert(who != NULL);
who->name = strdup(name);
return who;
}
void Person_destroy(struct Person *who){
assert(who != NULL);
free(who->name);
free(who);
}
И главная функция:
int main(int argc,char *argv[]){
struct Person *mike = Person_create("mike");
Person_print(mike);
Person_destroy(mike);
return 0;
}
Приведенный выше код не будет работать должным образом без функции strdup(). Вальгринд говорит, что адрес, который вы пытаетесь освободить бесплатно (who-> name), не является malloc'd. Какая история за этим, разве я не помню эту память, когда я строил структуру? И какая разница делает strdup()?
Вы уверены, что это соответствует вашему тестовому образцу? – ouah
Да, исходный код был более сложным, но когда я запускаю эту программу, он говорит: *** Ошибка в './ex1 ': free(): недопустимый указатель: 0x00000000004006fd ***" –
этот код выглядит нормально. Здесь есть два варианта. Либо 'Person_print' делает некоторые неприятные записи, которые, я сомневаюсь, или ваша программа отличается от этого теста. – ouah