为什么free不能清除指针值?

特雷弗·哈特

我试图向朋友解释免费的工作原理,所以我考虑了以下代码示例以尝试对其进行解释(很复杂,我知道):

#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之后,您需要为指针分配一个空值,但是我的问题是为什么?不应该只释放该内存并将指针设置为null吗?保留价值有什么意义?还是我只是不了解某事?

user2357112支持Monica

不应该释放...释放该内存

假设您的公司决定移动您的工作区,因此他们为您分配了一张新办公桌,并取消了您现有的办公桌。他们会立即清理您的旧办公桌吗?可能不是,除非他们立即需要它。如果回去检查抽屉,您可能会发现您留在那儿的口香糖,或者可能没有。您的空间已被释放,但这并不意味着它立即被清除消失不再是您的空间了。

不应该释放...将指针设置为null吗?

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么不能在指向字符串文字后使用free()指针

来自分类Dev

为什么在声明指针时不能打印已初始化的指针值?

来自分类Dev

为什么不能更改方法的指针?

来自分类Dev

为什么我不能显示指针的地址?

来自分类Dev

为什么不能分配该指针?

来自分类Dev

为什么不能将列表指针设置为列表中的最小值(排序单词)?

来自分类Dev

为什么不能将timeIntervalSince1970返回值存储到指针?

来自分类Dev

为什么在使用指针时不能通过使用“++”来增加 int 变量的值?

来自分类Dev

为什么不清除模型值?

来自分类Dev

为什么我不能使用javascript清除输入字段?

来自分类Dev

为什么我不能清除datagridview控件中的行?

来自分类Dev

为什么单击提交按钮后不能清除数据?

来自分类Dev

为什么“ ipconfig / flushdns”不能完全清除您的DNS?

来自分类Dev

为什么我不能在GWTP的UiBinder中清除FlexTable?

来自分类Dev

为什么我不能清除ArrayList的两个子列表

来自分类Dev

为什么我不能清除datagridview控件中的行?

来自分类Dev

为什么我不能清除background属性(WPF控件)

来自分类Dev

为什么我不能使用javascript清除输入字段?

来自分类Dev

为什么会出现“ free():无效指针”错误?

来自分类Dev

C ++为什么指针值改变了?

来自分类Dev

为什么结构指针的值错误

来自分类Dev

为什么可以为指针分配值?

来自分类Dev

为什么我不能将类型的值分配给实现带有接收者类型指针的方法的接口?

来自分类Dev

为什么指针值不能成为在内存空间中引用对象的好标签?

来自分类Dev

为什么不能将具有返回值的函数分配给具有 void 的指针函数?

来自分类Dev

为什么不能static_cast双无效指针?

来自分类Dev

为什么不能使用指针使用->调用重载()

来自分类Dev

为什么我不能对void指针进行算术运算?

来自分类Dev

为什么我不能重用功能的借用指针

Related 相关文章

  1. 1

    为什么不能在指向字符串文字后使用free()指针

  2. 2

    为什么在声明指针时不能打印已初始化的指针值?

  3. 3

    为什么不能更改方法的指针?

  4. 4

    为什么我不能显示指针的地址?

  5. 5

    为什么不能分配该指针?

  6. 6

    为什么不能将列表指针设置为列表中的最小值(排序单词)?

  7. 7

    为什么不能将timeIntervalSince1970返回值存储到指针?

  8. 8

    为什么在使用指针时不能通过使用“++”来增加 int 变量的值?

  9. 9

    为什么不清除模型值?

  10. 10

    为什么我不能使用javascript清除输入字段?

  11. 11

    为什么我不能清除datagridview控件中的行?

  12. 12

    为什么单击提交按钮后不能清除数据?

  13. 13

    为什么“ ipconfig / flushdns”不能完全清除您的DNS?

  14. 14

    为什么我不能在GWTP的UiBinder中清除FlexTable?

  15. 15

    为什么我不能清除ArrayList的两个子列表

  16. 16

    为什么我不能清除datagridview控件中的行?

  17. 17

    为什么我不能清除background属性(WPF控件)

  18. 18

    为什么我不能使用javascript清除输入字段?

  19. 19

    为什么会出现“ free():无效指针”错误?

  20. 20

    C ++为什么指针值改变了?

  21. 21

    为什么结构指针的值错误

  22. 22

    为什么可以为指针分配值?

  23. 23

    为什么我不能将类型的值分配给实现带有接收者类型指针的方法的接口?

  24. 24

    为什么指针值不能成为在内存空间中引用对象的好标签?

  25. 25

    为什么不能将具有返回值的函数分配给具有 void 的指针函数?

  26. 26

    为什么不能static_cast双无效指针?

  27. 27

    为什么不能使用指针使用->调用重载()

  28. 28

    为什么我不能对void指针进行算术运算?

  29. 29

    为什么我不能重用功能的借用指针

热门标签

归档