Давно не писал программы на 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:



g090617/RoadToC
Внесите свой вклад в разработку g090617/RoadToC, создав учетную запись на GitHub.github.com



Не стесняйтесь давать любые советы, хорошие и плохие приветствуются.