在c中使用malloc和结构

Jcm*_*010 4 c malloc struct

所以我正在尝试将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);
        }
}
Run Code Online (Sandbox Code Playgroud)

希望能给那些可以帮助我的人一个大的绿色复选标记.

Ant*_*hys 8

您需要为整个记录分配内存,并为每个字段分别分配内存.像这样的东西:

void string_realloc_and_copy (char **dest, const char *src)
{
  size_t len = strlen (src);
  *dest = realloc (*dest, len + 1);
  memcpy (*dest, src, len + 1);
}

typedef struct
{
  char *name;
  char *title;
} record;

record * record_new ()
{
  record *r = malloc (sizeof (record));
  r->name = NULL;
  r->title = NULL;
  return r;
}

void record_free (record *r)
{
  free (r->name);
  free (r->title);
  free (r);
}

void record_set_name (record *r, const char *name)
{
  string_realloc_and_copy (&r->name, name);
}

void record_set_title (record *r, const char *title)
{
  string_realloc_and_copy (&r->title, title);
}
Run Code Online (Sandbox Code Playgroud)

现在创建一个记录并用从用户读取的值填充它:

record *r;
char buffer[100 + 1];

r = record_new ();

printf("Enter a first name \n");
if (scanf ("%100s", buffer) == 1) {
  record_set_name (r, buffer);
}

...
Run Code Online (Sandbox Code Playgroud)