int *类型的malloc是不需要free的吗?

BlackSnail 2004-05-12 09:53:50
#include <stdio.h>
#include <stdlib.h>

main()
{
int *g_link;
int *buf;
int i;

g_link=(int *)malloc(10);
buf=g_link;
/* free(buf); 位置1 */
for (i=0;i<=9;i++)
{
*g_link=100000+i;
g_link++;
}

for (i=0;i<=9;i++)
{
printf("%d ",*p+i);
}

/* free(buf); 位置2 */

}

在上面的程序中,如果在位置2进行free,则会报错。
而在位置1进行free则不会出错,并且照常能在free后的地址中进行赋值。
难道说int *类型的malloc是不需要free的吗?
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
liudingjie 2004-05-12
  • 打赏
  • 举报
回复
关注一下!
goodname 2004-05-12
  • 打赏
  • 举报
回复
而在位置1进行free则不会出错,并且照常能在free后的地址中进行赋值。

----
这大概是碰巧不出错吧。并不是任何情况下都这样的。

malloc后是说,或者通知操作系统,这块内存有主了,我要是不释放,别人不能用的;
free后,表示把这块内存标记为可用了,但是,在下面程序运行的时候是否这段内存又
被别的程序又作它用了,是随机的,未知的,不确定的。
olivertree 2004-05-12
  • 打赏
  • 举报
回复
一定要free
goodname 2004-05-12
  • 打赏
  • 举报
回复
我觉得有2点楼主忽视了。
1)
你malloc出了10个byte的内存,指向这段内存的指针却是int类型的
在vc 32位下,一个byte是8位,而一个int是32位的;
在第一个循环赋值的过程,
当g_link(它是个int*)进行加1的时候,实际上指针移动了4个字节的位置
循环到第3次的时候,就产生内存越界了。
2)打印的时候,*p+i,实际上是(*p)+i,而不是*(p+i),而且p也没有定义。
cancer001 2004-05-12
  • 打赏
  • 举报
回复
不free会出现内存泄漏!
goodname 2004-05-12
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

main()
{
int *g_link;
int *buf;
int i;

g_link=(int *)malloc(10*sizeof(int));
buf=g_link;
for (i=0;i<10;i++)
{
*g_link++=100000+i;
}
g_link=buf;
for (i=0;i<=9;i++)
{
printf("%d\n",*(g_link+i));
}
free(buf);
}

itmaster 2004-05-12
  • 打赏
  • 举报
回复
是你理解错了
malloc过的肯定要free的
只不过free的是你开辟的内存区,不是指向内存区的指针
free过内存区后,指针可以继续指向其他内存区

BlackSnail 2004-05-12
  • 打赏
  • 举报
回复
谢谢各位的指点,特别谢谢goodname(叶落知秋)给予的详细解释

69,369

社区成员

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

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