Realloc无效指针。中止(核心倾倒)

时间:2015-05-04 23:35:32

标签: c pointers realloc

     *MyFile.h*

        typedef char* dado_t;
        typedef struct elemento elemento;
        typedef struct lista2 lista2;  

    *MyFile.c*

    struct elemento{
        dado_t str;
        elemento* ant;
        elemento* prox;
    };

    struct lista2{
        elemento* primeiro;
        elemento* ultimo;
        elemento* corrente;
    };

    void_insert(lista2* l, dado_t d){
       elemento* novo = malloc(sizeof(elemento*));
       novo->str = malloc(strlen(d) * sizeof(char));
       novo->str = d;
       l->corrente = novo;
       l->primeiro = novo;
       l->ultimo = novo;
       novo->prox = NULL;
       novo->ant = NULL;

    }

dado_t replace(lista2* l, dado_t d){
   dado_t retorno = malloc(strlen(corrente->str) * sizeof(dado_t));
   retorno = corrente->str;

   corrente->str = realloc(corrente->str, strlen(d) * sizeof(char));
   l->corrente->str = d;
   return retorno;
}

为什么我收到此错误?由于myel->str是已使用malloc()分配的指针。为什么错误?如果 realloc()

发生错误,我会使用临时元素*来防止

Obs:

3 个答案:

答案 0 :(得分:2)

使用elemento* novo = malloc(sizeof(elemento*));,malloc只为指针提供空间,但后来将其视为结构的空间。这会覆盖堆上的簿记信息。

答案 1 :(得分:1)

类型dado_tchar *最初指向任何内容(我的意思是,不是NULL,而是一些随机值)。你正确地为它分配了一些内存

novo->str = malloc(strlen(d) * sizeof(char));

有一个小错误:长度为d的C字符串需要一个字节,以便终止零。所以将其更改为

novo->str = malloc(strlen(d)+1);

这里有两个注意事项:sizeof(char)保证为1(我认为它符合规范;然后再说,它没有任何害处,也许你想确保你的语法正确分配int或其他更大的类型。) 其次,大多数标准库都有一个完全符合这个功能的函数:strdup。你需要做的只是用你的字符串地址来调用它,它本身就是+1部分。

然而,下一行是一个更严重的错误:

novo->str = d;

在C中,你不能以这种方式将一个字符串“分配”给另一个字符串。如果您想这样做,您可以将一个字符串的地址分配给另一个字符串。这可能导致无法预料的问题,例如将地址“赋值”为常量字符串(有效但无法修改),或者更糟糕的是,在“本地”堆栈的函数内创建的字符串。

在这种情况下,您希望从函数的参数中存储字符串d的完整副本,因此您将使用

strcpy (novo->str, d);

如果您释放结构novo,请不要忘记此指针将“丢失”。 “丢失”指针是您之前分配的内存块(在字符串malloc行中)但不再有指向的有效变量。因此,在释放elemento列表时,请先致电free(xx->str)

如果您在创建新str结构时确保NULL元素总是设置为elemento,则可以安全地致电{ {1}}表示字符串,即使它可能是free; NULL可以解决这个问题。事实上,你似乎总是分配一个值,所以这不是一个例子,但总的来说,我发现明确清除新创建的结构是安全的,例如使用free

答案 2 :(得分:1)

Peter Schneider正确地指出elemento* novo = malloc(sizeof(elemento*))只为指针分配了足够的空间(因为那是elemento*的原因);在这种情况下,有两种常见的习语,其中任何一种都可以在这里做得很好:

  • elemento* novo = malloc(sizeof(elemento))
  • elemento* novo = malloc(sizeof(*novo))

当然,您也需要采用Jongware的建议!