realloc指针数组

时间:2015-05-08 20:47:29

标签: c realloc

这是我计划的一部分。 parameters.path是一个字符串,其中包含我将使用的文件的路径,但不在此代码中。

typedef struct directory {

   char *name;
   char *path;

} directory;

void insertDir(directory*** array , char * path, char* name, int* length) {

    directory *p = malloc(sizeof(directory));

    p->path = malloc(strlen(path)+ 1);
    strcpy(p->path, path);

    p->name = malloc(strlen(name)+ 1);
    strcpy(p->name, name);

    *array = (directory**) realloc( *array , (*length) * (sizeof(directory*)));
    *array[(*length)] = p;
    (*length)++;

}

int main(int argc , char** argv) {

    directory** array = NULL;

    int lenght = 0;

    while(true) {
        insertDir(&array, parameters.path, name , &lenght);
    }

    return 0;
}

第三个realloc的分段错误失败。你能帮帮我吗?

2 个答案:

答案 0 :(得分:4)

执行realloc()时,您需要在长度上加1,因为您还没有增加它。

*array = realloc( *array , (*length + 1) * (sizeof(directory*)));

您还需要更改:

*array[(*length)] = p;

为:

(*array)[*length] = p;

因为下标运算符的优先级高于解除引用运算符。请参阅C运算符优先级表here[]内也不需要括号。

答案 1 :(得分:1)

除了(*array)[*length]索引编制问题之外,您还会对mallocrealloc的多次分配失败保持开放态度。首先,通常验证您的分配成功。够了。

接下来,使用realloc,最好使用temporary变量而不是数组重新分配。如果重新分配失败,realloc会返回NULL,导致您完全丢失地址array。这将导致丢失所有现有数据。相反,如果使用tmp指针进行重新分配,则可以以正常方式处理故障,并能够free最初分配给array的内存块。

这是处理分配/重新分配的一种更健壮的方法。 注意:您需要对重新分配失败的响应进行编码:

void insertDir (directory*** array, char *path, char *name, int *length)
{

    directory *p = malloc (sizeof *p);
    if (!p) {
        fprintf (stderr, "error: virtual memory exhausted.\n");
        exit (EXIT_FAILURE);
    }

    p->path = malloc (strlen (path) + 1);
    strcpy (p->path, path);

    p->name = malloc (strlen (name) + 1);
    strcpy(p->name, name);

    directory **tmp = realloc (*array, (*length + 1) * sizeof *tmp);
    if (!tmp) {
        fprintf (stderr, "error: struct reallocation failure.\n");
        exit (EXIT_FAILURE);
    }
    *array = tmp;
    (*array)[*length] = p;
    (*length)++;

}