Давно не писал программы на C. В этой серии рассказывается о том, что я узнаю, когда пытаюсь овладеть навыком C.
Разминка: реализация простой контактной книги на C
маллок
Первое, на что я потратил довольно много времени на отладку своей программы, это то, что я совершенно забыл, что мне нужно вручную выделять память для хранения моей контактной информации.
Вот простая структура, которую я создал для Contact.
struct Contact { char first[20]; char last[20]; char phone[20]; char address[100]; struct Contact* next; };
Но затем, когда я попытался создать новый контакт в своей функции addContact(), я не стал выделять память для динамического сохранения контакта, вместо этого я сделал следующее:
struct Contact newContact; strcpy(newContact.first, first)
Затем происходит ошибка сегментации, когда я пытаюсь распечатать свой список контактов :)
Всегда помните: выполняйте выделение памяти, если переменная должна быть доступна где-то еще. В противном случае, как только вы выйдете из области действия функции, которую вы создали для этой переменной, нет гарантии, что вы снова получите те же данные и ту же функцию.
char* против char[]
У меня также была некоторая путаница с char* и char[], но потом я разобрался.
Это довольно хорошо объясняет основную разницу между char* и char[]
После объявления char a[10] он возвращает адрес первого элемента. Следовательно, a совпадает с &a. Поскольку a — это адрес первого элемента массива, &a означает, что адрес адреса первого элемента такой же (в основном это похоже на цикл).
Однако вы не можете выполнять арифметические вычисления, такие как a++, нет смысла увеличивать адрес первого элемента массива, верно? Что это хотя бы значит?
Некоторые общие сведения о реализации списка контактов
Вначале я не особо раздумывал и использовал односвязный список, но позже, когда я попытался реализовать функцию удаления, мне стало сложно отслеживать элемент прямо перед тем, который нужно удалить. Поэтому я использовал двусвязный список для простоты. Другой способ сделать это с односвязным списком — создать фиктивную голову, чтобы упростить некоторые условия.
Резюме
Список контактов — это разминка, которая помогает мне усвоить некоторые вещи, которые я изучил в колледже. В конце концов, я лучше понял структуру, указатель и массив в C.
Чтобы следить за моим кодом и прогрессом, подписывайтесь на мой github:
Не стесняйтесь давать любые советы, хорошие и плохие приветствуются.