释放指向'double'值的指针

 mobiledu2502861593 发布于 2023-01-16 16:35

我能找到的所有关于释放'双'指针的东西都指的是释放指针的指针,这不是我所说的.我已经想出了如何做到这一点.

它甚至可能不是一个大的事情在所有,但我注意到,当我free()一个int,charfloat指针,价值被删除或垃圾值替换,但是当我free()一个double指针,该值保持不变.

这是我测试过的代码:

int main()
{
  int *p_a = malloc(sizeof(int));
  *p_a = 1;

  char *p_b = malloc(sizeof(char));
  *p_b = 'b';

  float *p_c = malloc(sizeof(float));
  *p_c = 3.565;

  double *p_d = malloc(sizeof(double));
  *p_d = 7.77;

  printf("Before 'free()':\n");
  printf("A: %p\t%d\n", p_a, *p_a);
  printf("B: %p\t%c\n", p_b, *p_b);
  printf("C: %p\t%g\n", p_c, *p_c);
  printf("D: %p\t%g\n", p_d, *p_d);

  free(p_a);
  free(p_b);
  free(p_c);
  free(p_d);

  printf("\nAfter 'free()':\n");
  printf("A: %p\t%d\n", p_a, *p_a);
  printf("B: %p\t%c\n", p_b, *p_b);
  printf("C: %p\t%g\n", p_c, *p_c);
  printf("D: %p\t%g\n", p_d, *p_d);

  return 0;
}

这产生了以下输出:

Before 'free()':
A: 0x8f2e008    1
B: 0x8f2e018    b
C: 0x8f2e028    3.565
D: 0x8f2e038    7.77

After 'free()':
A: 0x8f2e008    0
B: 0x8f2e018
C: 0x8f2e028    1.46175e-33
D: 0x8f2e038    7.77

这是正常的吗?我对如何malloc()free()工作的理解是,当你malloc()指针时,你为指针指向了一些内存字节.这是在heap无法访问的地方放置的,并且在计算机上触发内存清理heap之前它不会脱落free(),而不是由用户控制.因此,当你free()指针时,你基本上摆脱了指针和它指向的地址之间的关联,允许稍后使用该内存.

鉴于这一切,为什么double指针仍然指向相同的值?

现在我考虑一下,为什么指针在free()s 之后根本就有一个地址?

由于我是初学者C,所以非常感谢任何和所有的智慧和知识.感谢您的时间.

编辑:经过进一步的测试和干预后,我发现如果你输入一个数字超过6位并在最后一个数字上向上舍入(例如777.7777)的数字double,那么free()它就会失去它的四舍五入.

为了显示:

Before 'free()':
D: 0x8f2e038    777.778

After 'free()':
D: 0x8f2e038    777.777

这支持@罗德里戈的假设(的意见)认为,因为double是8个字节-相对于int,charfloat的4个字节- free()仅修改了前4个字节,所以它不会失去它的所有数据.

谢谢大家的帮助!

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有