Итак, я пытаюсь добавить malloc в приложение телефонной книги, которое я создал, но, поскольку я новичок в C, я не уверен, что то, что я делаю, правильно. Я столкнулся с небольшой проблемой, но я прочитал книгу для начинающих, которая у меня есть, и в ней не так много подробностей, как хотелось бы, я не могу сказать с помощью поиска в Google, если я просто совершенно неправильно в том, как я настроил malloc или что-то еще, что я пропустил.
В основном у меня есть 4 массива в моей структуре: First_Name, Last_name, home, cell. У каждого из них есть 2 функции: функция, которая получает информацию от пользователя, и функция, которая распечатывает и добавляет информацию о пользователе в телефонную книгу. Сейчас у меня есть небольшой фрагмент исходного кода, который добавляет только первое имя в телефонную книгу (так что это не весь код), и в каждую функцию, которая получает пользовательский ввод, я хочу добавить функцию malloc. Прямо сейчас у меня есть только первое имя и первая настройка malloc, но проблема заключается в том, что когда я иду проверять телефонную книгу, чтобы убедиться, что имя было введено успешно, программа завершает работу. Если я удалю malloc, он успешно работает.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define BUFFER 50
//Structure for contacts
typedef struct friends_contact {
char *First_Name;
char *Last_Name;
char *home;
char *cell;
} fr;
void menu(fr * friends, int *counter, int user_entry, int i);
void setFirst(fr *, int *, int i);
char getFirst(fr *, int i);
void add_contact(fr * friends, int *counter, int i);
void print_contact(fr * friends, int *counter, int i);
int main()
{
int user_entry = 0;
fr *friends;
int counter = 0;
int i = 0;
menu(friends, &counter, user_entry, i);
getch();
return 0;
}
//Menu function
void menu(fr * friends, int *counter, int user_entry, int i)
{
do {
int result;
printf("\nPhone Book Application\n");
printf
("1) Add friend\n2) Delete friend\n3) Show a friend\n4)Showphonebook\n5)Exit\n");
scanf("%d", &user_entry);
if (user_entry == 1) {
add_contact(friends, counter, i);
}
if (user_entry == 2) {
}
if (user_entry == 3) {
}
if (user_entry == 4) {
print_contact(friends, counter, i);
}
} while (user_entry != 5);
}
void setFirst(fr * friends, int *counter, int i)
{
// THE MALLOC FUNCTION!
friends = (fr *) malloc(BUFFER * sizeof(fr));
printf("Enter a first name \n");
scanf("%s", friends[*counter].First_Name);
if (friends != NULL) {
free(friends);
}
}
char getFirst(fr * friends, int pos)
{
printf("%s ", friends[pos].First_Name);
return *friends[pos].First_Name;
}
void add_contact(fr * friends, int *counter, int i)
{
setFirst(friends, counter, i);
(*counter)++;
}
void print_contact(fr * friends, int *counter, int i)
{
for (i = 0; i < *counter; i++)
if (strlen(friends[i].First_Name)) {
getFirst(friends, i);
}
}
Хочу поставить большую зеленую галочку тому, кто может мне помочь.
setFirstвыfreeзаполняете свойfriendsбуфер, по сути говоря, что мне это больше не нужно. Когда вы делаете это, эта память просто уходит. Если вы собираетесь динамически выделять структуры для вызывающей стороны, вы должны либо предоставить отдельную функцию освобождения, либо сообщить пользователю, что он несет ответственность за очистку этой структуры. Кроме того, вы всегда меняете только локальную копию указателя друзей. Если вы хотите указать указатель вызывающего объекта на новый буфер, вам нужно изменить тип аргумента наfr**. - person jpm   schedule 09.11.2012scanf("%s",invitingBufferOverflow);так же ужасно (или еще хуже), какgets(invitingBufferOverflow)- person Happy Green Kid Naps   schedule 09.11.2012