请教:C语言内存方面的问题

deyiti123 2008-03-23 01:50:02
小弟这几天在温习C语言,子曾经日过:"温固而知新",真的有新发现啊
#include "stdio.h"
char *mem()
{
char *ret=NULL; // char const *ret=NULL;
ret =(char *)malloc(8);
return ret;
}
int main()
{
char *p=NULL;
p=mem();
if(p!=NULL)
pirntf("a");
return 0;
}
1.请问程序会不会有输出?由malloc()分配的内存在程序结束后被回收?
2.如果mem()函数的第一句改为注释中的语句,再回答第1问?
3.如果把ret定义成全局变量,请再回答第1问?
...全文
75 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
deyiti123 2008-03-23
  • 打赏
  • 举报
回复
没想到我居然有200分,更没想到20分没办法平均分,所以...
abupie 2008-03-23
  • 打赏
  • 举报
回复
程序运行完系统会回收的。
但是运行过程中是有内存泄露的,如果是长时间运行的server程序,会导致服务器内存不足。
野男孩 2008-03-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 deyiti123 的回复:]
我当时的想问的是如果把ret定义为一个局部或者全局静态成员变量,
这个变量不会在mem()函数调用后结束生命周期,主函数可以继续使用它
或者它指向的内容
void mem( char *ret)
{
ret=(char*)malloc(8);
*ret='12345678'; //这个写法很有问题。你的意思是不是把"12345678"复制到新分配的8个字节上?
//如果是,那么用memcpy(ret, "12345678", 8);注意,这里没有多余的字节存\0
}
int main()
{
char *p=NULL;
mem(p);
printf("%s",*p)
return 0;
}
[/Quote]

不管是局部的还是全局的、静态的,只要是malloc的,就必须有一个地方来释放它才是完全正确的。否则一定有内存泄漏。
ttkk_2007 2008-03-23
  • 打赏
  • 举报
回复

void mem( char *ret) //你这是值传递,你只是把局部变量ret指向了新开辟的空间,p仍为NULL
{
ret=(char*)malloc(8);
*ret='12345678'; //你这个赋值也不对,ret = "1234567"
}
int main()
{
char *p=NULL;
mem(p);
printf("%s",*p)
return 0;
}
NamelessOnePS 2008-03-23
  • 打赏
  • 举报
回复
void mem( char *ret)
{
ret=(char*)malloc(8);
*ret='12345678';
}

这种用法是不可以的.
要么使用返回值char *,
要么使用char **ret,
否则调用者
char *p = NULL;
mem(p),
后p仍然是NULL
NamelessOnePS 2008-03-23
  • 打赏
  • 举报
回复
其实,这类问题只要明确内存的所有权问题,就不会造成内存泄漏
1.如果定位是类似于Malloc的函数,
即把这块内存的所有权交给调用者,由调用者来进行释放;
2.如果定位是Get类的函数,
即内存的所有权属于函数内部,就需要由内部来释放内存.
那么定义成static或全局的.
但是需要在ret =(char *)malloc(8); 之前增加:
if(NULL != ret)
{
free(ret);
}
在这种情况下,调用者也必须注意Get到内存指针可能会失效.
deyiti123 2008-03-23
  • 打赏
  • 举报
回复
我当时的想问的是如果把ret定义为一个局部或者全局静态成员变量,
这个变量不会在mem()函数调用后结束生命周期,主函数可以继续使用它
或者它指向的内容
void mem( char *ret)
{
ret=(char*)malloc(8);
*ret='12345678';
}
int main()
{
char *p=NULL;
mem(p);
printf("%s",*p)
return 0;
}
独孤过儿 2008-03-23
  • 打赏
  • 举报
回复
一个核心准则:你要时刻保证你malloc()的内存在你的掌控之下!
deyiti123 2008-03-23
  • 打赏
  • 举报
回复
不好意思,搞错了 注释中的语句打错了,我设想的上这样:static char *ret=NULL;
  • 打赏
  • 举报
回复
1 会输出,会被操作系统回收,有内存泄露
2 同1
3 同1

69,369

社区成员

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

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