C语言中free函数的一点测试
free
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <malloc.h> #include <stdio.h> int main() { int p = 1; int *q; q = (int *)malloc(sizeof(int)); *q = 2; printf("%d %d %p", p, *q, q); free(q); printf(" %d %d %p", p, *q, q); return 0; } devC++: 输出结果1:1 2 0000000000BF13E0 1 12517712 0000000000BF13E0 输出结果2:1 2 00000000001813E0 1 1573200 00000000001813E0 输出结果2:1 2 0000000000AC13E0 1 11272528 0000000000AC13E0 vscode: 输出结果1:1 2 0000000000761A50 1 2 0000000000761A50 输出结果2:1 2 0000000000951A50 1 2 0000000000951A50 输出结果2:1 2 00000000001F1A50 1 2 00000000001F1A50
|
指针pfree前后指向的地址一致,但是dev似乎把p指向的地址中的值也free了?而vscode中的值还是不变的。
我的vscode上结果如上,但是老婆的电脑上vscode输出和devc++类似???(疑惑增加了)
但如果对free后的指针进行赋值还是可以实现的,并且此时值为均为所赋值的值。但这是不正确的操作(赋值操作输出和老婆一样)。
1 2
| devC++:1 2 00000000001B13E0 1 3 00000000001B13E0 vscode:1 2 0000000000791A50 1 3 0000000000791A50
|
WARN:free只能释放堆空间。像代码区、全局变量与静态变量区、栈区上的变量,都不需要程序员显示释放,这些区域上的空间,不能通过free函数来释放,否则执行时,会出错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <malloc.h> #include <stdio.h> int main() { int p = 1; int *q; q = (int *)malloc(sizeof(int)); printf printf("%p %p", &p, q); q = &p; printf("%d %d %p", p, *q, q); free(q); *q = 3; printf(" %d %d %p", p, *q, q); return 0; } vscode执行结果:000000000061FE1C 00000000009E1A50 1 1 000000000061FE1C 3 3 000000000061FE1C devc++执行结果:000000000062FE14 00000000007A19D0 1 1 000000000062FE14 3 3 000000000062FE14
|
错误,虽然vscode可以执行但是会报错 warning: attempt to free a non-heap object ‘p’ 即释放一个非堆上的空间
devc++执行不报错但是是错误危险的操作。
参考资料:C语言动态内存的申请和释放_weixin_30267691的博客-CSDN博客