我很好奇,为什么 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("%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
成员自动。你必须这样做。