内存的出错处理。

whutxuan 2003-10-20 10:13:39
int main()
{
char **p;
char *q;
malloc_mem(&q);
malloc_mem(p);//非法。
}
void malloc_mem(char **p)
{
//如何处理传入char **p指针的时候,产生的错误,也就是说传char **p,我要让
函数返回!而传 &q,的时候程序正常执行呢?
(*p)=(char *)malloc(100);
}
...全文
31 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
TianGuangZao 2003-10-20
  • 打赏
  • 举报
回复
加上函数原型声明后,还报错吗?
我用 gcc 没报任何错误和警告,已经打开 -Wall 警告。

我测试的完整代码:malloc() 的函数原型在 stdlib.h 里声明的。

#include <stdlib.h>
void malloc_mem(char **p);

int main()
{
char **p;
char *q;
malloc_mem(&q);
malloc_mem(p);
return 0;
}

void malloc_mem(char **p)
{
//如何处理传入char **p指针的时候,产生的错误,也就是说传char **p,我要让
//函数返回!而传 &q,的时候程序正常执行呢?
(*p)=(char *)malloc(100);
}

我的理解是代码没错,就是存在逻辑错误。
malloc_mem(p);

传递的是main() 中 p 指针的拷贝,或称之为传值。malloc_mem(char **p) 函数中的 p 是自动变量,函数返回时就销毁了,所以分配的内存成了“三不管地区”了,造成泄露。

正确的函数定义应该是:
#include <stdlib.h>
char ** malloc_mem(void)
{
return *p =(char *)malloc(100);
}
int main()
{
char **p;
p = malloc_mem(void);
return 0;
}

更加简单的方法是根本没必要使用二维指针。

#include <stdlib.h>
char * malloc_mem(void)
{
return p =(char *)malloc(100);
}
int main()
{
char *p;
p = malloc_mem(void);
return 0;
}
winco 2003-10-20
  • 打赏
  • 举报
回复
malloc_mem(p);//非法。
此中情况编译器自动报错
winco 2003-10-20
  • 打赏
  • 举报
回复
typedef char* lchar;
void malloc_mem(lchar& p)
{
//如何处理传入char **p指针的时候,产生的错误,也就是说传char **p,我要让
//函数返回!而传 &q,的时候程序正常执行呢?
p=(char *)malloc(100);
}
int main()
{
lchar *p;
lchar q;
malloc_mem(q);
// malloc_mem(p);//非法。
return 0;
}
TianGuangZao 2003-10-20
  • 打赏
  • 举报
回复
#include <stdio.h>

void malloc_mem(char **p);

int main()
...

你忘记写函数原型了。

69,336

社区成员

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

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