将内存动态分配给包含并集的结构数组的最佳方法是什么?我应该先malloc
然后realloc
到record_user
还是data_user
?下面我将详细说明,这是示例代码:
#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;
#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
#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 };
如您所见,artist
和user
有一个联合结构。我决定创建一个联合结构,以便将多个结构数组传递给通用函数。在完整的代码中,我有更多的联合,但这并不是列出所有联合的意义。我只是真的需要了解我将在下面进一步解释的内容。
record_user
这样的 record_artist
具有一些预设数据,我分别在data_user
中链接到data_artist
和data.c
。现在,需要在运行时增加此数据。我的意思是,如果record_user
中有100个预设数据行(与record_artist
相同),我想添加更多的行甚至删除它们。为此,我知道有malloc
和realloc
。我尝试使用它,进行了一些测试,但我不知道这样做的最佳方法是什么。
我试图在我的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
,我不知道如何搬到这里。如果相同或不同...如果我使用原始结构(分配内存),联合是否能够读取新的内存大小?还是最好与联合结构一起使用,而保持原始结构不变?
我希望有人能清除我的想法!