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

问题描述 投票:0回答:1

我很好奇,为什么 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";
}
c struct malloc free
1个回答
1
投票

*F = "bagel"; 不是你如何分配一个字符串。相反,代码会覆盖指针的值。myWord->w 所以当你打电话 free,它不再是正确的指针值。

要想知道指针的变化,可以试试这个。

printf("%p\n", (void*)myWord->w);
setWord(&(myWord->w));      // set to "bagel"
printf("%p\n", (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 成员自动。你必须这样做。

© www.soinside.com 2019 - 2024. All rights reserved.