*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:
答案 0 :(得分:2)
使用elemento* novo = malloc(sizeof(elemento*));
,malloc只为指针提供空间,但后来将其视为结构的空间。这会覆盖堆上的簿记信息。
答案 1 :(得分:1)
类型dado_t
是char *
,最初指向任何内容(我的意思是,不是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的建议!