C语言 munmap_chunk():无效指针,何时使用 free()



我很好奇为什么free(myWord->w)会是一个无效的指针?我为它分配内存,所以我不应该也释放它吗?还是释放结构也会释放其所有字段?

C语言的新手,因此非常感谢对指针世界的任何见解!

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct word {
char *w;
} WORD;
void setWord(char **f);
int main() {
WORD *myWord = malloc(sizeof(WORD));
myWord->w = malloc(6);
strcpy(myWord->w, "hello"); // set to "hello"
setWord(&(myWord->w));      // set to "bagel"

free(myWord->w); /* munmap_chunk(): invalid pointer. Aborted (core dumped) */
free(myWord);
return 0;
}
void setWord(char **F) {
*F = "bagel";
}

*F = "bagel";不是分配字符串的方式。相反,代码会覆盖指针的值myWord->w因此当您调用free时,它不再是正确的指针值。

要查看指针是否更改,请尝试以下操作:

printf("%pn", (void*)myWord->w);
setWord(&(myWord->w));      // set to "bagel"
printf("%pn", (void*)myWord->w);

因此,free调用将失败,因为指针值不是您从malloc获得的指针值。

所以而不是*F = "bagel";使用

strcpy(*F, "bagel");   // NOT: *F = "bagel"

此外,您无需传递w的地址。只需做:

void setWord(char *F) {
strcpy(F, "bagel");
}

并像这样称呼它:

setWord(myWord->w);

和。。。

我给它分配内存,所以我不应该也释放它吗? 还是释放结构也会释放其所有字段?

是的,您必须free它。

否,结构free不会自动free成员。你必须这样做。

最新更新