連續使用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回答

bennyhuo

2021-01-20

   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);


注意一下区别。

1
4
bennyhuo
回复
阿寶1118
对的。
2021-01-20
共4条回复

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程