Malloc和realloc用于链接到结构数组的结构的并集

时间:2018-07-04 07:55:52

标签: c memory struct malloc realloc

将内存动态分配给包含并集的结构数组的最佳方法是什么?我应该先malloc然后reallocrecord_user还是data_user?下面我将详细说明,这是示例代码:

core.h

#define MAX_USER sizeof(record_user) / sizeof(record_user[0])
#define MAX_ARTIST sizeof(record_artist) / sizeof(record_artist[0])
/* all my other defines here */

typedef enum {
    admin = 1,
    basic = 0
} type;

typedef struct {
    int hour;
    int minute;
    int second;
} tm;

typedef struct {
    int day;
    int month;
    int year;
} date;

typedef struct {
    short id;
    char name[MAX_USER_NAME];
    char surname[MAX_USER_SURNAME];
    char email[MAX_USER_EMAIL];
    char password[MAX_PASSWORD_LENGTH];
    date birthday;
    date subscription_date;
    tm subscription_time;
    type role;
} user;

typedef struct {
    short id;
    char name[MAX_ARTIST_NAME];
    char genre[MAX_GENRE][MAX_GENRE_NAME];
    char producer[MAX_PRODUCER_NAME];
    char nationality[MAX_NATIONALITY_NAME];
    int starting_year;
} artist;

/* and other structs */

typedef struct {
    enum { USER, ARTIST } type;
    union {
        user *u_user;
        artist *u_artist;
    };
    int size;
} data;

data.h

#ifndef DATA_H
#define DATA_H

#include "core.h"

extern user record_user[];
extern artist record_artist[];

extern data data_user;
extern data data_artist;
/* etc */

#endif

data.c

#include "data.h"

// SOME PRESET DATA
user record_user[] = {
{ 1, "Name 1", "Surname 1", "name1.surname1@email.com", ",+o[oS", { 29, 9, 1996 }, { 7, 3, 2011 }, { 18, 25, 58 }, 0 },
/** The list goes on **/
}

artist record_artist[] = {
{ 1, "Coldplay", { "Pop", "Britpop", "Alternative Rock" }, "Parlophone", "United Kingdom", 1997 },
/** The list goes on **/
}

data data_user = { .type = USER,.u_user = record_user,.size = MAX_USER };
data data_artist = { .type = ARTIST,.u_artist = record_artist,.size = MAX_ARTIST };

如您所见,artistuser有一个联合结构。我决定创建一个联合结构,以便将多个结构数组传递给通用函数。在完整的代码中,我有更多的联合,但这并不是列出所有联合的意义。我只是真的需要了解我将在下面进一步解释的内容。

record_user这样的

record_artist具有一些预设数据,我分别在data_user中链接到data_artistdata.c。现在,需要在运行时增加此数据。我的意思是,如果record_user中有100个预设数据行(与record_artist相同),我想添加更多的行甚至删除它们。为此,我知道有mallocrealloc。我尝试使用它,进行了一些测试,但我不知道这样做的最佳方法是什么。

我试图在我的main.c文件中声明以下内容:

int main() {    
    data_user.u_user = (user *)malloc(size * sizeof(user));
    /***/
}

但是我也尝试过

int main() {
    record_user = (user *)malloc(size * sizeof(user));
    /***/
}

但是,正如我已经想象的那样,我丢失了data.c文件中分配的所有预设数据。

我的目标

我想要实现的是为数据malloc 临时大小(用于开始 100 ),然后链接到结构数组(或联合结构),具有起始临时大小,到我的预设数据,以便使用它们。自然,在运行时,我将添加更多行,为此,我将使用realloc(甚至删除它们)。 这是我的添加函数的示例代码:

data *add_data(data *record_data) {
    date record_date;
    tm record_time;

    switch (record_data->type) {
    case USER:
    {
        /* SOMEWHERE HERE I should use realloc to my record_data */
        int ID = record_data->size;
        record_data->u_user[ID].id = ID;
        printf("\n\n\tNEW USER");
        printf("\n\tEnter name: ");
        strcpy(record_data->u_user[ID].name, inputString(MIN_USER_NAME, MAX_USER_NAME));
        printf("\tEnter surname: ");
        strcpy(record_data->u_user[ID].surname, inputString(MIN_USER_SURNAME, MAX_USER_SURNAME));
        printf("\tEnter email: ");
        strcpy(record_data->u_user[ID].email, inputString(MIN_USER_EMAIL, MAX_USER_EMAIL));
        printf("\tEnter password: ");
        strcpy(record_data->u_user[ID].password, inputString(MIN_PASSWORD_LENGTH, MAX_PASSWORD_LENGTH));
        /* etc for birthday, subscription date */

        record_data->size += 1;

        printf("\n\tUser added!");
        return record_data;
    }
    case ARTIST:
        /* asking for input data */

        return record_data;
    }
}

这就是我在main.c文件中调用函数的方式

int main() {
    /***/
    data_user = *add_data(&data_user);
    /***/
}

如果我应该使用 struct record_user union struct data_user,我不知道如何搬到这里。如果相同或不同...如果我使用原始结构(分配内存),联合是否能够读取新的内存大小?还是最好与联合结构一起使用,而保持原始结构不变?

我希望有人能清除我的想法!

0 个答案:

没有答案