c - 为什么 free 不清除指针值?

标签 c pointers memory memory-management

我试图向 friend 解释免费的工作原理,所以我想到了以下代码示例来尝试解释它(复杂,我知道):

#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;
}

考虑到这段代码会释放堆​​上分配的内存,我假设如果我然后打印出分配给指针的字符串,它会做一些奇怪的事情或使程序崩溃,因为我假设它会尝试输出空值;但是当我运行它时,它最终只输出了两次字符串。我想我会逐步检查它以了解原因,因为在我看来我认为它可能将字符串复制到堆栈或其他东西,然后指针将指向一个新的内存地址并且旧内存毕竟被清理了(并不是那个场景有任何意义,但是嘿,我不知道它还会是什么),但是当我单步执行代码时,它不仅没有释放内存,指针实际上仍然指向同一个内存地址 它具有相同的值。

当我调查它时,人们说你需要在调用 free 后为指针分配一个空值,但我的问题是为什么?不应该 free 只是释放该内存并将指针设置为 null 吗?保值的意义何在?或者我只是不明白什么?

最佳答案

Shouldn't free ... deallocate that memory

假设您的公司决定搬迁您的工作空间,因此他们为您分配了一张新办公 table 并取消了您现有的办公 table 。他们会立即清理你的旧办公 table 吗?可能不会,除非他们立即需要它。如果你回去检查抽屉,你可能会找到你留在那儿的口香糖,也可能找不到。您的空间已解除分配,但这并不意味着它会立即清除消失。这不再是您的空间。

Shouldn't free ... set the pointer to null?

free 获取指针的副本,因为指针是按值传递的。 free 无法删除您持有指针的变量。

关于c - 为什么 free 不清除指针值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33840319/

相关文章:

c - 为什么我的访问权限不好

c++ - Qt 中的 QPointer、QSharedPointer 和 QWeakPointer 类有什么区别?

java - C 指针 - 从 Char 到 Char 的无效转换*

ios - 在 ScrollView 中释放多个 View Controller 的内存

C++结构成员内存分配

c - 内存分配错误

c - 在c中传递双指针作为值传递

c - C中带有字符的指针,无法调用值

memory - Redis:我如何(或应该)删除 pubsub channel

c - 在使用 eof 获取特定输入值时在 c 中获得无限循环