基本上,我的结构中有4个数组,分别是“First_Name”,“Last_name”,“home”和“cell”。每个数组都有两个函数,一个从用户获取信息并将用户信息打印并添加到电话簿中的函数。现在我只有一小部分原始代码,仅将名字添加到电话簿中(因此不是整个代码),并且在获取用户输入的每个函数中,我想添加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
函数中,你正在释放你的friends
缓冲区,实际上是在说我不再需要它了。当你这样做时,那个内存就会消失。如果你要为调用者动态分配结构体,你要么提供一个单独的释放函数,要么让用户知道他们有责任清理那个结构体。此外,你只是改变了本地副本的friends
指针。如果你想将调用者的指针指向一个新的缓冲区,你需要将参数类型更改为fr **
。 - jpmscanf("%s",invitingBufferOverflow);
和使用gets(invitingBufferOverflow)
一样糟糕(或更糟)。 - Happy Green Kid Naps