код -> https://onlinegdb.com/aQOm4zcL8
вроде у указателями не на путала так почему ?
C/C++
Почему не правило выводит "key" (СИ) ?
Обычно в чистом Си строки сохраняют в статических массивах внутри структур. И если под структуру выделяется память (calloc или malloc), то все эти массивы так же будут в динамической области, не вызовут переполнения стека и удалятся при удалении структуры.
т.е. char car_vendor[15]{}; и т.д.
Но даже в этом случае нужно следить за тем, чтобы ненароком не выходить за пределы установленной длины. Это может переписать соседние поля структуры или сломать стек, если структура выделена в стек для каких либо действий над ней.
в случае, если у вас указатели - то они должны указывать на некую выделенную вами область, в которой можно разместить строки.
char *car_vendor = NULL пустой указатель
после выделения памяти под структуру нужно дополнительно делать следующие для всех этих указателей
car_vendor = calloc (lenght максимально длинного названия + 1 чтобы влез терминатор);
и только после этого можно копировать по этому указателю строку не превышающую выделенную длину.
А при удалении структуры - вначале нужно высвободить все эти указатели
free(car_vendor)
и только потом удалить саму структуру, иначе будет утечка памяти.
т.е. char car_vendor[15]{}; и т.д.
Но даже в этом случае нужно следить за тем, чтобы ненароком не выходить за пределы установленной длины. Это может переписать соседние поля структуры или сломать стек, если структура выделена в стек для каких либо действий над ней.
в случае, если у вас указатели - то они должны указывать на некую выделенную вами область, в которой можно разместить строки.
char *car_vendor = NULL пустой указатель
после выделения памяти под структуру нужно дополнительно делать следующие для всех этих указателей
car_vendor = calloc (lenght максимально длинного названия + 1 чтобы влез терминатор);
и только после этого можно копировать по этому указателю строку не превышающую выделенную длину.
А при удалении структуры - вначале нужно высвободить все эти указатели
free(car_vendor)
и только потом удалить саму структуру, иначе будет утечка памяти.
Максим Закомолдин
спасибо
У вас по указателям в структуре в момент инициализации полей должна выделятся память. Но лучше каждый массив структуры сделать статическим, так ваш список будет проще сохранять в бинарный файл. С целью экономии памяти рекомендую поля структуры ранжировать по размеру занимаемой памяти от меньшего к большему, это касается и указателя на структуру (sizeof вам в помощь). Вот здесь имеется двунаправленный список: https://pastebin.com/eVYTS7QK там подсмотрите как он организован.
Максим Закомолдин
спасибо
Похожие вопросы
- Что такое "СИ"?
- Здраствуйте, я не понимаю что означает "int" и "main" можете обьяснить)
- Нужна помощь с написанием кода на языке "С"
- Помогите написать программу по теме "Строки" на языке C.
- (Ошибка) аргумент типа "const char *" несовместим с параметром типа "char *"
- Составить процедуру, "рисующую"
- Как "подружить" MS-DOS и C++?
- Программирование на СИ "Написать программу подсчёта суммы нечётных элементов из 20 введенных"
- Нужно не выводить пробел в конце строки. язык си (Андрей, даже ваш вариант сайт считает не рабочим... )
- Актуальность Си и Си++