Tre*_*art 1 c memory pointers memory-management
我试图向朋友解释免费是如何工作的,所以我想到了下面的代码示例来尝试解释它(复杂,我知道):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
  char *stringPtr = NULL;
  //Pass the size of the string in bytes to malloc
  stringPtr = (char *)malloc(10 * sizeof(char));
  strcpy(stringPtr, "A String. ");
  printf("%s", stringPtr);
  free(stringPtr);
  printf("%s", stringPtr);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)
认为这段代码会释放堆上分配的内存,我假设如果我然后打印出分配给指针的字符串,它会做一些奇怪的事情或者崩溃程序,因为我认为它会尝试输出空值; 然而,当我运行它时,它最终只输出两次字符串.我想我会一步一步看看为什么,因为在我的脑海里,我想也许它将字符串复制到堆栈或其他东西然后指针指向一个新的内存地址,旧的内存毕竟被清理干净了(并不是说这种情况会有任何意义,但是,嘿,我不知道它会是什么),但当我逐步完成代码不仅没有释放内存,指针实际上仍然指向相同的内存地址,它具有相同的值.
当我调查它时,人们说你需要在调用free后指定一个空值,但我的问题是为什么?不应该释放只是解除分配该内存并将指针设置为null?保留价值的重点是什么?或者我只是不理解某事?
不应该自由...释放那个记忆
假设您的公司决定移动您的工作区,因此他们会为您分配一个新桌面并取消分配您现有的桌面.他们会立即清理你的旧桌子吗?可能不会,除非他们立即需要它.如果你回去检查抽屉,你可能会发现你留在那里的口香糖,或者你可能没有.你的空间被解除分配,但这并不意味着它立即被清除或消失.这不再是你的空间了.
不应该自由...将指针设置为null?
free获取指针的副本,因为指针是按值传递的.free无法擦除您持有指针的变量.