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