gpt4 book ai didi

c - 结构体类型数组的动态分配

转载 作者:行者123 更新时间:2023-11-30 16:25:33 25 4
gpt4 key购买 nike

我在向结构体中的动态数组添加元素(结构体)时遇到问题。

这里是主要结构

struct testfw_t
{
char* program;
int timeout;
char *logfile;
char *cmd;
bool silent;
bool verbose;
struct testTab *tests;
};

这里是数组

struct testTab 
{
int size;
struct test_t *oneTest;
};

最后是要添加的元素:

struct test_t
{
char *suite; /**< suite name */
char *name; /**< test name */
testfw_func_t func; /**< test function */
};

所以我必须在struct testfw_t的数组testTab中添加一个struct test_t,我迷失在很多中>mallocrealloc 调用。

PS:主结构的初始化(如果它有用的话):

struct testfw_t *testfw_init(char *program, int timeout, char *logfile, char *cmd, bool silent, bool verbose){

struct testfw_t *t;
t = malloc(sizeof(struct testfw_t));

t->program = program;
t->timeout = timeout;
t->logfile = logfile;
t->cmd = cmd;
t->silent = silent;
t->verbose = verbose;
t->tests = malloc(sizeof(struct testTab));
t->tests->size=0;
t->tests->oneTest=NULL;

return t;
}

编辑:我正在尝试

struct test_t *nouveau;

nouveau->suite = suite;
nouveau->name = name;
nouveau->func=func;

//fw->tests=realloc(fw->tests->oneTest,(fw->tests->size+1) * sizeof(struct testTab));

fw->tests->oneTest=malloc((fw->tests->size+1) * sizeof(nouveau));

fw->tests->oneTest[fw->tests->size+1] = *nouveau;
fw->tests->size++;

return nouveau;

最佳答案

在您的代码中,当您使用 -> 访问 nouveau 时,它不会指向任何地方。这是未定义的行为。

相反,只需使用 realloc 增大数组,然后分配给最后一个元素:

// make array larger by one
fw->tests->oneTest = realloc(fw->tests->oneTest,
(fw->tests->size + 1) * sizeof(struct testTab));

// to do: test success

// assign values to new slot
fw->tests->oneTest[fw->tests->size]->suite = strdup(suite);
fw->tests->oneTest[fw->tests->size]->name = strdup(name);
fw->tests->oneTest[fw->tests->size]->func = func;

// increase the array size
fw->tests->size++;

这是分配代码,在分配失败后无法恢复旧数据。失败时唯一有用的做法是错误退出。 Jonathan Leffler 指出,可以通过先分配到临时指针并在分配失败时恢复旧数据来避免这种情况。 (当然,在这种情况下您仍然需要决定该怎么做。)

我在这里使用了(非标准但广泛使用的)函数strdup来复制字符串的内容。如果只要您的结构和不同,或者字符串是文字,就保证字符串“存活”,那么您的变体就可以工作,但通常最好存储副本。

关于c - 结构体类型数组的动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53353864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com