| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2462 人关注过本帖, 1 人收藏
标题:关于动态内存分配使用时候释放的一些疑问
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用q215236213在2012-7-31 15:08:51的发言:

多谢多谢啊,原来是这个原因!又懂了一点,,现在修改了之后就木有问题了
#include
#include
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;
   
}

你获得了p指针,直接把它扔给函数f(p)在里面*p=8不就了事了么,弄那么多*号很漂亮吗?

授人以渔,不授人以鱼。
2012-07-31 15:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
由于C语言的局部变量都是在堆栈上分配的 所以 int a; int b; 这样的东西 都会在函数头用一个 sub esp, XXX 来分配 相比用堆 这样快很多 一条指令而已

引用 有几种方式 但基本就是 mov [esp+YY], 555 这样的 上面说不好说就是 不同的编译器和优化参数 引用或者说是寻址的方法不同 细说的话有好的的 但大概就这样
2012-07-31 15:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
入口地址加偏移量是吧,那本身就是指针的概念。

授人以渔,不授人以鱼。
2012-07-31 15:27
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
如果没有红色的标记的话,无法改写i的值
#include <stdio.h>
#include <malloc.h>
void f(int ** q)
{
    int i = 8 ;
    **q = i ;
}
int main(void)
{
    int * p ;
    p = (int *)malloc(sizeof(int));
    int i = 3 ;//
    p = &i ;//如果没有这个步骤的话 无法改写i的值 ??

    f(&p);//把p的地址发送给函数
   
    printf("i = %d\n", i);
//  free(p);   
    return 0;
   
}
2012-07-31 15:32
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
p = &i ;//如果没有这个步骤的话 无法改写i的值 ??

我怀疑你都不明白这是干啥的 就来问
2012-07-31 15:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
呵呵,想改变i的值,直接i=8不就结了么。所以我说学语言学到玩代码、玩语法的地步,是舍本逐末,特别是那些所谓的考试题。

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

呵呵,想改变i的值,直接i=8不就结了么。所以我说学语言学到玩代码、玩语法的地步,是舍本逐末,特别是那些所谓的考试题。

我觉得 他的问题不是这里 他的问题是道理都不懂 瞎试验

如果对这些东西有个清晰的认识 这都是很自然的东西 怕的就是 连谭浩强都懒得看或者看一些比谭浩强还烂的书 然后就是瞎试验 试不成 就来问
2012-07-31 15:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
他是要练指针,但不知道int i之后已经获得了一个指针,才又重新申请一个指针指向i,并用多此一举的传递方式传到一个函数中进行引用修改,是螺旋式绕圈做法。除了不知道指针为何物之外,更大的原因是为了使用各种各样的指针和取址符号以突出C语言的独特形式,与别的编程语言区别开来,否则不算学会C了。看看很多人写的代码,都有这种心态,我看是互相感染的,因为到处是这种代码,所以上网搜索学习的人都或多或少地学了这种东西,为了用指针不惜把代码写得相当晦涩难懂。

[ 本帖最后由 TonyDeng 于 2012-7-31 15:44 编辑 ]

授人以渔,不授人以鱼。
2012-07-31 15:43
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
回复 11楼 TonyDeng
这样写直接改写了i的值,如果我想给指针变量 q 手动分配内存空间,要如何来做呢?
#include <stdio.h>
#include <malloc.h>
void f(int * q)
{
    int i = 8 ;
//  q = (int *)malloc(sizeof(int)); //这里加了这个之后就不能修改 i的值了,还是搞不懂这个地方!
    *q = i ;
}
int main(void)
{
    int i = 3 ;
    f(&i);
    printf("i = %d\n", i);
    return 0;
}
2012-07-31 15:46
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
回复 15楼 zklhp
这里的 指针变量 p 是用来存放 i 的地址
2012-07-31 15:48
快速回复:关于动态内存分配使用时候释放的一些疑问
数据加载中...
 
   



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

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