【问题标题】:realloc array of pointersrealloc 指针数组
【发布时间】:2015-05-08 20:47:28
【问题描述】:

这是我的计划的一部分。 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 上失败,出现分段错误。你能帮帮我吗?

【问题讨论】:

  • 你不应该在 C 中从 malloc/realloc/calloc 中键入 cast return。早点养成习惯!

标签: c realloc


【解决方案1】:

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

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

你还需要改变:

*array[(*length)] = p;

到:

(*array)[*length] = p;

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

【讨论】:

  • 谢谢,这是一个错误,但有趣的是它仍然以相同的方式工作:/
  • 这并没有真正起作用,您正在导致未定义的行为。当你这样做时,任何事情都可能发生,包括“看起来”工作一段时间。
  • 改正后还是失败了……也许错误不在这里
  • 您正在调用insertDir,但函数名为insetrDir。您应该收到有关未定义函数的错误。
  • 哎呀,我没有复制粘贴那部分,所以它就在这里...但是非常感谢您的帮助..我将继续分析我的整个代码:D
【解决方案2】:

除了(*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)++;

}

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2015-02-04
    • 2018-03-25
    • 2012-03-15
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多