我在使用和理解C中的free()函数时遇到了问题.
我尝试编写这个例子以继续重用指针,但我不明白为什么会出现错误:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct box
{
char message[20];
}box;
box *newBox()
{
box *inBox;
inBox = (box *) malloc(sizeof(box));
return inBox;
}
int main()
{
box *temp = NULL;
temp = newBox();
strcpy(temp->message, "Hello");
printf("%s\n", temp->message);
free(temp);
strcpy(temp->message, "World");
printf("%s\n", temp->message);
free(temp);
strcpy(temp->message, "People");
printf("%s\n", temp->message);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Hello
World
memory(531,0x7fff77e9e300) malloc: *** error for object 0x7fe8ba404a90: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
有解决方法吗?
我不确定你为什么free(temp)在这里有两个:
temp = newBox();
strcpy(temp->message, "Hello");
printf("%s\n", temp->message);
free(temp); /* ? */
strcpy(temp->message, "World");
printf("%s\n", temp->message);
free(temp); /* ? */
strcpy(temp->message, "People");
printf("%s\n", temp->message);
Run Code Online (Sandbox Code Playgroud)
该代码应该是
temp = newBox();
strcpy(temp->message, "Hello");
printf("%s\n", temp->message);
strcpy(temp->message, "World");
printf("%s\n", temp->message);
strcpy(temp->message, "People");
printf("%s\n", temp->message);
free(temp); /* Free the allocated memory after use */
Run Code Online (Sandbox Code Playgroud)
一旦你free记忆了,你就不能使用它.所以free记忆在最后.
旁注:演员:
inBox = (box *) malloc(sizeof(box));
Run Code Online (Sandbox Code Playgroud)
不是必需的,这就是原因