| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2462 人关注过本帖, 1 人收藏
标题:关于动态内存分配使用时候释放的一些疑问
只看楼主 加入收藏
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
结帖率:100%
收藏(1)
已结贴  问题点数:10 回复次数:66 
关于动态内存分配使用时候释放的一些疑问
通过f()函数来修改 i 的值,为什么后面加上 free()函数 会报错呢?
#include <stdio.h>
#include <malloc.h>
void f(int ** q)
{
    int i = 8 ;
//    *q = &i ;//用*q来存放i的地址,最后不能修改i的值,因为i的地址是系统分配的,函数调用完之后会释放掉!
    **q = i ;
}
int main(void)
{
    int * p ;//定义一个地址变量
    p = (int *)malloc(sizeof(int));//给p分配一块动态内存空间
    int i = 3 ;
    p = &i ;
    f(&p);
   
    printf("i = %d\n", i);//输出i的值
//  free(p);   为什么不能在这里手动释放分配的动态内存??
    return 0;
   
}
搜索更多相关主题的帖子: include 动态 
2012-07-31 14:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
你后面的p是malloc()返回给你的指针的吗?不是的话,free()谁的内存?

授人以渔,不授人以鱼。
2012-07-31 14:44
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:7 
你自己改变了p的地址,p = &i ; 已经不是malloc分配的那块内存了.
当然不能用free来释放喽.

我们都在路上。。。。。
2012-07-31 14:58
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:1 
我觉得写程序 要先按照书上说的套路来 等你完全理解了 再试那些奇怪的东西

臆造的程序 很多时候是不能用的 因为你在写的时候不知道原理 自然也写不对


[ 本帖最后由 zklhp 于 2012-7-31 15:06 编辑 ]
2012-07-31 15:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
Z版给解释一下汇编中int i这样声明的变量i到底是什么吧,不用有人总多此一举地弄个指针又指向这个东西。

授人以渔,不授人以鱼。
2012-07-31 15:08
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
回复 3楼 hellovfp
多谢多谢啊,原来是这个原因!又懂了一点,,现在修改了之后就木有问题了
#include <stdio.h>
#include <malloc.h>
void f(int ** q)
{
    int i = 8 ;
//  *q = &i ;
    **q = i ;
}
int main(void)
{
    int * p ;
    p = (int *)malloc(sizeof(int));
    *p = 3 ;
    f(&p);
    printf("*p = %d\n", *p);
    free(p);
    return 0;
   
}
2012-07-31 15:08
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2012-7-31 15:08:23的发言:

Z版给解释一下汇编中int i这样声明的变量i到底是什么吧,不用有人总多此一举地弄个指针又指向这个东西。

在目前的硬件平台上 int i 就是从堆栈上面分配的一个空间
2012-07-31 15:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
i这个标识符本身就是一个地址是吧?

授人以渔,不授人以鱼。
2012-07-31 15:13
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2012-7-31 15:13:17的发言:

i这个标识符本身就是一个地址是吧?

不好说 一般是用寄存器引用的
2012-07-31 15:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
int i;
之后某个时间,要
i = 1;
这第二句怎么操作?怎样随时随地找到i?

授人以渔,不授人以鱼。
2012-07-31 15:18
快速回复:关于动态内存分配使用时候释放的一些疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022119 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved