关于free的一点小困惑

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++:
输出结果11 2 0000000000BF13E0 1 12517712 0000000000BF13E0
输出结果21 2 00000000001813E0 1 1573200 00000000001813E0
输出结果21 2 0000000000AC13E0 1 11272528 0000000000AC13E0
vscode:
输出结果11 2 0000000000761A50 1 2 0000000000761A50
输出结果21 2 0000000000951A50 1 2 0000000000951A50
输出结果21 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
//有无均不影响,即使分配了空间,在下一个操作中,q指向了p所在空间,而p不是用malloc分配的空间,依旧错误
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博客