请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

連續使用free()釋放動態記憶體問題

老師我想請問,為什麼先使用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 19:55:12

   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 回复 有任何疑惑可以回复我~
  • 提问者 阿寶1118 #1
    歐?!所以動態記憶體的位置是不能移動的囉?!
    可以請老師說明一下,為什麼不能修改mem嗎?
    還有為什麼這樣的操作依然可以獲取那一個記憶體位置的值
    且能移動mem而編譯器也不報錯呢?
    回复 有任何疑惑可以回复我~ 2021-01-20 20:01:37
  • bennyhuo 回复 提问者 阿寶1118 #2
    是啊,你买了一栋房子,房子又不会动。
    回复 有任何疑惑可以回复我~ 2021-01-20 20:07:56
  • 提问者 阿寶1118 回复 bennyhuo #3
    歐~所以我可以想像成
    申請動態記憶體 等於申請了一棟房子
    一旦完成記憶體配置就決定動態記憶體的位置了(房子的地址),如果修改就是違法了。
    如果真的要移動指標位置,
    就像老師寫的下面那個版本,
    先用另一個指標指向動態記憶體的頭(房子地址),再對這一個指標做操作,
    這樣既可以移動指標也不不會產生違法操作。
    請問老師這樣的理解是正確的嗎?
    回复 有任何疑惑可以回复我~ 2021-01-20 20:11:14
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信