动态分配结构类型的数组

时间:2018-11-17 17:43:40

标签: c dynamic-memory-allocation

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

这是主要结构

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 test_t的数组testTab中添加一个struct testfw_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;

1 个答案:

答案 0 :(得分:0)

在您的代码中,使用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复制字符串的内容。只要保证您的结构和不同的字符串是“有效的”,或者如果是文字,您的变体就可以工作,但是通常最好存储副本。