尝试学习malloc的问题

尝试学习malloc的问题,c,malloc,buffer,C,Malloc,Buffer,当用户输入朋友的信息时,我希望指向分配的适当空间的指针和朋友信息存储在此分配的空间中。我读过snippits的其他地方提到使用缓冲区数组作为scanf的参数,但我只是想把这些放在一起。这是我到目前为止所拥有的 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> //Structure for contacts typedef struct

当用户输入朋友的信息时,我希望指向分配的适当空间的指针和朋友信息存储在此分配的空间中。我读过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 Application\n");
      printf("1) Add friend\n2) Delete friend\n3) Show a friend\n4)" 
      "Showonebook\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) 
{
    //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);
    }
 }
#包括
#包括
#包括
#包括
//联系人的结构
typedef struct friends\u联系人{
char*名字;
字符*姓氏;
查尔*家;
字符*单元;
}fr;
无效菜单(fr*朋友、int*计数器、int用户输入、int i);
void setFirst(fr*,int*,int i);
char getFirst(fr*,int i);
无效添加联系人(fr*朋友、int*计数器、int i);
无效打印联系人(fr*朋友、int*计数器、int i);
int main()
{
int user_entry=0;
fr friends[5];
int缓冲区[50];
int计数器=0;
int i=0;

对于(i=0;i您的
fr
变量是指向堆栈上已分配空间的某个位置的指针。您不应该使用它-它已经初始化,您无法对其进行malloc(或者至少您从来没有这样做过)。您应该传递一个指针并对其进行初始化

也就是说:

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\u 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);
}
inti;
fr friends[5];

对于(i=0;我可以修改格式/缩进。是的,对不起,整个复制粘贴的事情对我来说有点奇怪。好的,让我看看我是否有这一点,在我的主要函数中,你说我需要将
fr friends[5]
更改为
fr*friends
,然后在
setFirst
函数中我需要添加
friends[i]。第一个名字=(char*)malloc(sizeof(char)*(字符串长度+1));
后面跟着
friends=(fr*)malloc(sizeof(fr)*你想要的fr个数);
?再次原谅我的知识不足,这都是为了尝试学习新东西。有趣的…应该是
fr[i]。信息
还是
朋友[i].info
因为当我尝试按上面的方式运行它时,会出现编译器错误
之前预期的主表达式'['token
天哪,我真不敢相信我这么做了。是的,应该是
friends
,因为这是变量-
fr
就是类型。抱歉。试图帮你解决这个问题-你不需要我搞砸。哈哈,别担心,很高兴我能抓住它,而不是茫然地盯着我的电脑。现在让我问你这个问题,朱为了进一步理解这一点,让我假设我把
免费(friends[I].First_Name)
在与
malloc
相同的循环中,这不会立即删除用户信息吗?意思是一旦输入姓名,它会从电话簿中删除,因此永远不会出现吗?这与我已经尝试过的事实无关。姓名仍然会出现在电话簿中,我只是好奇为什么。W你把它放在这里了吗?
free
释放你所有的
malloc
'd内存。如果你在释放内存后再也不访问它,你就不会出错,尽管最好是系统地释放内存。另外,如果这个问题涉及面更广,最好问另一个问题,而不是发表一堆评论。