hhyjmd
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分104分
  • 威望11点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:2216回复:11

一个关于内存的问题

楼主#
更多 发布于:2005-07-30 21:22
Test 函数的语句GetMemory(str, 200)并没有使str 获得期望的内存,str 依旧是NULL,为
什么?
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL
strcpy(str, "hello"); // 运行错误
}
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2005-07-31 10:17
你需要判断malloc时能不能正确分配.

而且你的作法是错的.正确的应该这样写

void GetMemory(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100); // str 仍然为 NULL
strcpy(str, "hello"); // 运行错误
}
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
hhyjmd
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分104分
  • 威望11点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-31 10:33
谢谢znsoft的回答,不过我更想知道为什么p = (char *)malloc(sizeof(char) * num);
没能分配到内存,也就是说到底c++内部是如何分配内存的阿
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-31 21:33
你怎么知道没分配到内存?znsoft不是说了么,你的代码是错的。没能分配到内存的情况太罕见了。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地下室#
发布于:2005-08-01 00:11
malloc不出内存也正常,不过比较少见.当你的物理或虚存不够时,就会出错,最好判断一下指针是不是空的.或者用seh处理一下. 这样不处理95%时候不会出错,但一出错就是当机或非法操作之类的.hehe
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
5楼#
发布于:2005-08-01 00:14
比较好点的代码
bool GetMemory(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
if(*p)
return true;
else
return false;

}
void Test(void)
{
char *str = NULL;
if(GetMemory(&str, 100))
{
strcpy(str, "hello");
free(str);
}
}
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
hhyjmd
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分104分
  • 威望11点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-08-01 20:20
谢谢znsoft的热心回答,我这样理解不知道对不对:
p就相当于是一个数组名,p = (char *)malloc(sizeof(char) * num);显然就不对了,
而*p = (char *)malloc(sizeof(char) * num);
就相当于char *p=new char [num]
这样的话虽然有点差强人意不过好像更容易理解。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
7楼#
发布于:2005-08-01 21:33
没必要理解成数组什么的. 当然,数组和指针是等价的.
一维数组名相当于一级指针.  二维数组名相当于二级指针
你的想法是对指针本身赋值,只能按我给出的方法,否则原始的指针就没有值.即使你传指针进去,指针本身也是一个变量,函数的参数相当于局部变量,你的原来的代码只是对局域变量赋值. 最简单的办法就是用指针的引用,这样好理解一点.不过,引用只能在c++中使用.
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
8楼#
发布于:2005-08-01 21:35
c++版本
没有错误处理或seh处理,在c++中最好把malloc改成new/delete. 以下代码只能在c++ 编译器中通过.
void GetMemory(char * & p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL
strcpy(str, "hello"); // 运行错误
}
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
hhyjmd
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分104分
  • 威望11点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-08-02 11:05
嗯,知道了,我发现自己又懂了很多。
谢谢
seleneFox
驱动牛犊
驱动牛犊
  • 注册日期2005-08-01
  • 最后登录2005-08-11
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-08-03 16:29
你不是没有得到内存,是得到了内存以后没有返回给你接受内存地址的指针里
hhyjmd
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分104分
  • 威望11点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-08-03 20:18
10楼的说的不错,我想是系统给p的副本_p分配了内存,只是p没得到内存,这时会内存泄露。
游客

返回顶部