当用户输入朋友的信息时,我希望指针分配适当的空间,并将朋友信息存储在此分配的空间中。我读过Snippits的其他地方,这些地方提到使用缓冲区数组作为SCANF的论点,但是我只是将所有这些都放在一起。这是我到目前为止所拥有的。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
//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[5];
int buffer[50];
int counter=0;
int i=0;
for(i=0;i<5;i++)
{
friends[i].First_Name = (char*) malloc(sizeof(char) * 64);
free(friends[i].First_Name);
}
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 Applicationn");
printf("1) Add friendn2) Delete friendn3) Show a friendn4)"
"Showonebookn5)Exitn");
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)
{
//malloc issue **
friends=(fr*) malloc(sizeof(fr));
printf("Enter a first name n");
scanf("%s",friends[*counter].First_Name);
}
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);
}
}
这显然只是代码的一部分,截至目前,我在添加名称函数中输入名称后会得到一个分割错误。它最后一次戒烟之前循环到菜单。我意识到我在某个地方出错了,我想尝试使用缓冲解决方案解决此问题。解决方案有人吗?
您的fr
变量是指向堆栈上某个位置的指针,该位置已经分配了空间。您不应该使用它 - 它已经是初始化的,并且无法将其挂掉(或者至少您永远不应该)。相反,您应该通过指针并初始化。
也就是说:
fr *friends;
然后当您要分配空间
时friends = (fr*) malloc(sizeof(fr)* NUMBER OF FR YOU WANT);
此外,如果要使用它们,则需要初始化结构的元素,因为它们都是指示器。这将类似地完成
friends[i].First_Name = (char*) malloc(sizeof(char)* (LENGTH OF STRING + 1));
否则将是friends[i]->First_Name
,具体取决于您将其发送到功能的方式。
一个很好的解决方案就是将结构的成员初始化您的main
int i;
fr friends[5];
for(i=0;i<5;i++)
{
friends[i].First_Name = (char*) malloc(sizeof(char) * 64);
friends[i].Last_Name = (char*) malloc(sizeof(char) * 64);
friends[i].home = (char*) malloc(sizeof(char) * 64);
friends[i].cell = (char*) malloc(sizeof(char) * 64);
}
//
//Do functions (without malloc'ing)
//
for(i=0;i<5;i++)
{
free(friends[i].First_Name);
free(friends[i].Last_Name);
free(friends[i].home);
free(friends[i].cell);
}
在这里,我选择64是字符串的长度。您可以将其设置为您认为有效的任何东西。
底线是您必须为指针分配空间才能使用它。否则,它不会指向您可以使用的任何内存,并且会得到细分故障。另外,一旦您分配了内存,请不要忘记释放。请记住,一旦释放了它,就无法使用它(除非您再次将其malloc)。