我能找到的所有关于释放'双'指针的东西都指的是释放指针的指针,这不是我所说的.我已经想出了如何做到这一点.
它甚至可能不是一个大的事情在所有,但我注意到,当我free()
一个int
,char
或float
指针,价值被删除或垃圾值替换,但是当我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
,char
和float
的4个字节- free()
仅修改了前4个字节,所以它不会失去它的所有数据.
谢谢大家的帮助!