LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 966|回复: 11

令我迷惑的一段c代码

[复制链接]
发表于 2005-10-20 22:57:20 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <stdlib.h>

void fun(int *p){
p=(int *)malloc(sizeof(int));
}

void fre(int *p){
free(p);
}


main(){
int i;
fun(&i);
fre(&i);
}

执行到free()就出现段错误。在不改变引用方式传递i的前提下,怎样才能使一个在函数中的free()  去释放在另外一个函数中分配的空间呢?
跪求高手指点,我已经郁闷好几天了
发表于 2005-10-20 23:25:54 | 显示全部楼层
调用fre时,你传入了i的地址
回复 支持 反对

使用道具 举报

发表于 2005-10-20 23:31:18 | 显示全部楼层
c是pass by value的
你的fun只是改变了被推入堆栈的p的值,不会改变p原来的值
也就是说fun执行完之后
i和p的值都不变
一般来说如果利用一个函数去调用malloc,这个函数应该保存,并返回malloc的返回值

第二
用一个函数去来free,这个函数的原型你写对了
不过调用时应该传给它一个pointer,而且一定是左值
所以还是这样:
int *fun(){
return (int *)malloc(sizeof(int));
}

int main(){
int *p = fun();
fre(p);
}


第三
如果如果分配时一定要用参数传递的话
应该这样
void fun(int **p){
*p = (int *)malloc(sizeof(int));
}

int main(){
int *p;
fun(&p);
fre(p);
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-20 23:33:36 | 显示全部楼层
是啊,不然我怎么用引用的方式传递参数阿。
回复 支持 反对

使用道具 举报

发表于 2005-10-20 23:44:41 | 显示全部楼层
调用fun把malloc分配的内存地址存到i变量里
你调用fre(&i)释放的内存地址并不是malloc分配的地址,而是i这个变量的地址

可以这样写 fre((int*)i)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-20 23:53:56 | 显示全部楼层
第三
如果如果分配时一定要用参数传递的话
应该这样
void fun(int **p){
*p = (int *)malloc(sizeof(int));
}

int main(){
int *p;
fun(&p);
fre(p);
}


我改为:
#include <stdio.h>
#include <stdlib.h>

void fun(int **p){
*p=(int *)malloc(sizeof(int));
}

void fre(int *p){
free(p);
}


main(){
int *i;
fun(&i);
fre(i);
}

可还是不行,仍然在执行到free()处出错
回复 支持 反对

使用道具 举报

发表于 2005-10-21 00:02:43 | 显示全部楼层
int i;
fun(&i);
fre((int*)i);

或者
int *i;
fun(i);
fre(i);

建议你重新看一下指针方面的内容
回复 支持 反对

使用道具 举报

发表于 2005-10-21 00:09:53 | 显示全部楼层
Post by bysky
int i;
fun(&i);
fre((int*)i);

或者
int *i;
fun(i);
fre(i);


建议你重新看一下指针方面的内容
int i;
fun(&i);
fre((int *)i);
虽然运行没有问题,因为C不是strong typed语言
但不推荐这样写
还是声明为指针为好

int *i;
fun(i);
这句之后i的值根本不变
fre(i)
回复 支持 反对

使用道具 举报

发表于 2005-10-21 00:13:44 | 显示全部楼层
Post by redsonic
我改为:
#include <stdio.h>
#include <stdlib.h>

void fun(int **p){
*p=(int *)malloc(sizeof(int));
}

void fre(int *p){
free(p);
}


main(){
int *i;
fun(&i);
fre(i);
}

可还是不行,仍然在执行到free()处出错

重新编译
另外不错执行了你原来编译的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-21 00:32:35 | 显示全部楼层
第三
如果如果分配时一定要用参数传递的话
应该这样
void fun(int **p){
*p = (int *)malloc(sizeof(int));
}

int main(){
int *p;
fun(&p);
fre(p);
}

感谢,现在运行正常了。
再问一下,这种释放空间的做法是不是不常用
还是:
int *fun(){
return (int *)malloc(sizeof(int));
}

int main(){
int *p = fun();
fre(p);
}

这种方法最值得提倡吧?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表