連續使用free()釋放動態記憶體問題
来源:9-7 几个常见的内存操作函数

阿寶1118
2021-01-20
老師我想請問,為什麼先使用free()釋放掉mem這個動態記憶體後面的程式就會跑不動了呢?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void MemoryControl() {
//memchr()
//memcmp()
//使用memset(void *dest,int value,int len):將dest後len個記憶體都初始化為value
//常配合動態記憶體配置時使用
char *mem = malloc(10);
memset(mem, 0, 10);
for (int i = 0; i < 10; i++) {
printf("%d ", *mem);
mem++;
}
puts("");
free(mem);
//memmove(void *dest,void *src,int len):將src中len個記憶體一定到dest的記憶體位置
char src[] = "HelloWorld";
char *dest = malloc(11);
memset(dest, 0, 11);
memcpy(dest, src, 11);
puts(dest);
memmove(dest + 3, dest + 1, 4);
puts(dest);
free(dest);
}
int main() {
MemoryControl();
return 0;
}```
我發現先不釋放mem又可以跑得動,請問是為什麼呢?
free()函數只能最後調用嗎?
写回答
1回答
-
char *mem = malloc(10);
memset(mem, 0, 10);
for (int i = 0; i < 10; i++) {
printf("%d ", *mem);
mem++;
}
puts("");
free(mem);注意,你的 mem 被修改了,所以后面 free(mem) 实际上是非法操作。
char * const mem = malloc(...);
char * p = mem;
...
p++;
...
free(mem);
注意一下区别。
142021-01-20
相似问题