Во-первых, когда вы выделяете пространство для данных, вы совершаете распространенную ошибку:
newInfo->brand = malloc (sizeof(brand));
Это выделяет достаточно места для хранения указателя на char
, а не самих данных.Затем вы пытаетесь скопировать в него данные:
strcpy(newInfo->brand, brand);
, что вполне может записать больше данных, чем было создано для вас.
Вам нужно создать достаточно места для всей строкиплюс маркер конца строки \0
:
newInfo->brand = malloc (strlen(brand) + 1);
И вам это тоже понадобится где-то:
#include <string.h>
Во-вторых, когда вы сравниваете указатель на 0
, традиционный способ C - использовать NULL
вместо 0
(или не использовать вовсе).Это (в основном) тот же эффект, но более понятно, что вы выполняете сравнение указателей.
В-третьих, в freeCarinfo
вы используете carinfo
, а затем проверяете, является ли оно NULL
(0
),Вам действительно нужно знать, может ли функция вызываться со значением NULL
, в этом случае вы чаще всего не используете carinfo->brand
, или это определенно не NULL
, и в этом случае вам не нужен последний тест.
В-четвертых, как уже упоминалось другими, вы выделяете newInfo
способом, который не дает нужного количества места:
carinfo_t *newInfo = (carinfo_t *) malloc (sizeof(newInfo));
Что вам, вероятно, нужновместо этого:
carinfo_t *newInfo = malloc (sizeof(carinfo_t));
или даже лучше:
carinfo_t *newInfo = malloc (sizeof(*newInfo));
Таким образом, здесь много и много неправильного, поэтому вы расстраиваетесь.Перечитайте информацию об указателях и динамическом размещении и по-новому взгляните на ваш код в зависимости от того, что вы узнали.