p = q free(p)后 q是什么

jingank 2009-05-14 04:16:04

#include <stdio.h>
main()
{
int *p = (int *)malloc(sizeof(int));
int *q = (int *)malloc(sizeof(int));
*p=123;
q = p;
printf("%d\n",*p);
free(p);
printf("%d\n",*q);
}
...全文
452 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2009-05-15
  • 打赏
  • 举报
回复

#include <stdio.h>

main()
{
int *p = (int *)malloc(sizeof(int)); // p指向了一块区域
int *q = (int *)malloc(sizeof(int)); // q也指向了一块区域
*p = 123; // 向p指向的区域填123
q = p; // 现在q也指向了p指向的那块区域,q指向的那块区域没有了引用,传说中的memory leak
printf("%d\n",*p);
free(p); // p的那块区域不属于p了,尽管你指向那里,但是系统有权自行操作那块空间,你虽然可以搞那块空间,但是接下来就有可能搞死系统
printf("%d\n",*q);
}
光宇广贞 2009-05-15
  • 打赏
  • 举报
回复
q = p;
这句用的就是不对。
原来分给Q的HEAP怎么办?小实验的不严谨也会出问题的。
pathuang68 2009-05-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hairetz 的回复:]
#include <stdio.h>
main()
{
int *p = (int *)malloc(sizeof(int));
int *q = (int *)malloc(sizeof(int));
*p=123;
q = p; //q之前malloc返回的地址会丢失,内存泄漏
printf("%d\n",*p);
free(p);
printf("%d\n",*q); //释放p(等于释放q,值一样),再访问,这个时候是野指针
}
[/Quote]
精辟的分析!要想指针速成,请看下面文章即可:
C/C++中指针和引用之相关问题研究
wangxipu 2009-05-15
  • 打赏
  • 举报
回复
ls
大家说的很详细了
我想我就不多说了
dinjay 2009-05-15
  • 打赏
  • 举报
回复
野指针 就是没有确定地址 但分配了内存空间
Bestrem_9 2009-05-14
  • 打赏
  • 举报
回复
p原先指向的内存无法释放,内存泄露,p指针指向q指针的地址,但是q释放后,就成了
野指针了,它还是指向那块内存单元,但是所指向对象的值就不一定了,完全随机了
fuzzy_man 2009-05-14
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 smallsquareface 的回复:]
p和q指向同一块地址,由于一个被释放了,则另外一个就野了
[/Quote]
一块未释放,内存泄露。 2个名字不同的野指针。
碎方脸 2009-05-14
  • 打赏
  • 举报
回复
p和q指向同一块地址,由于一个被释放了,则另外一个就野了
sunzerui 2009-05-14
  • 打赏
  • 举报
回复
又看了一遍
再顶一下12楼
无语了
我是又在另一个层次上理解了一下指针!
sunzerui 2009-05-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 rypgood 的回复:]
int *p = (int *)malloc(sizeof(int));
int *q = (int *)malloc(sizeof(int));
*p=123;
q = p;
printf("%d\n",*p);
free(p);
printf("%d\n",*q);

其实可以很简单地这样理解:
第1,2句:两个命名为p和q的篮子,
第3句:名字为p的篮子里面放上苹果
第4句:从这个时候开始,如果我们说名字为q的篮子的时候,指的是名字为p的篮子,原来名字为q的篮子没名字了,这个时候,原来名字为p的篮子有两个名字,p和q

[/Quote]
好形象哎!
顶一下啊!
yangch_nhcmo 2009-05-14
  • 打赏
  • 举报
回复

#include <stdio.h>
main()
{
int *p = (int *)malloc(sizeof(int));
int *q = (int *)malloc(sizeof(int));
*p=123;
q = p; // p q指向同一地址
printf("%d\n",*p);
free(p); //释放p的同时,q也释放了
printf("%d\n",*q);//q变成了野指针
}
lpf000 2009-05-14
  • 打赏
  • 举报
回复
内存泄漏,访问无效内存
grandsealy 2009-05-14
  • 打赏
  • 举报
回复
#include <stdio.h>
main()
{
int *p = (int *)malloc(sizeof(int));
int *q ;//= (int *)malloc(sizeof(int));
*p=123;
q = p; //你只是想把p的指针赋给q,其实可以不申请内存
printf("%d\n",*p);
free(p);
//printf("%d\n",*q);
}
yejinson 2009-05-14
  • 打赏
  • 举报
回复
q的内存地址丢失
老邓 2009-05-14
  • 打赏
  • 举报
回复
野指针
woshisaoge 2009-05-14
  • 打赏
  • 举报
回复
谭浩强的C++程序设计很好,去看看指针部分。
jenglev 2009-05-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jingank 的回复:]
如果是那样 结果应该是
123
123
才对啊
可是结果是
123
-53237748758
[/Quote]
p被释放掉了,即那块内存不属于程序了,放什么数据我们不知道,所以q是一个随机数。
breezes2008 2009-05-14
  • 打赏
  • 举报
回复
《C和指针》---专门针对指针的详解。
由于q在堆中分配的内存空间,然而马上又有此句:q=p;
,那么q原先指向的内存区域就会失去引用,造成内存泄漏。

printf("%d\n",*p);
free(p);
printf("%d\n",*q); //此句完全等价于:printf("%d\n",*p);
  • 打赏
  • 举报
回复
#include <stdio.h>
main()
{
int *p = (int *)malloc(sizeof(int));
int *q = (int *)malloc(sizeof(int));
*p=123;
q = p; //q之前malloc返回的地址会丢失,内存泄漏
printf("%d\n",*p);
free(p);
printf("%d\n",*q); //释放p(等于释放q,值一样),再访问,这个时候是野指针
}
rypgood 2009-05-14
  • 打赏
  • 举报
回复
int *p = (int *)malloc(sizeof(int));
int *q = (int *)malloc(sizeof(int));
*p=123;
q = p;
printf("%d\n",*p);
free(p);
printf("%d\n",*q);

其实可以很简单地这样理解:
第1,2句:两个命名为p和q的篮子,
第3句:名字为p的篮子里面放上苹果
第4句:从这个时候开始,如果我们说名字为q的篮子的时候,指的是名字为p的篮子,原来名字为q的篮子没名字了,这个时候,原来名字为p的篮子有两个名字,p和q
第5句:让你告诉我们,名字为p的篮子里面放了什么?因为这个时候p和q同时都指放苹果的哪个篮子,所以你会说,那是苹果
第6句:给我把名字为p的那个篮子烧掉,装苹果的篮子就给烧掉了
第7句:名字为q的篮子装的是什么?不知道,因为那个篮子刚才被你烧掉了,所以根本没有名字为q的篮子,当然,名字为p的篮子也没有了
加载更多回复(11)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧