关于一个申请内存的问题

ribut9225 2007-07-28 04:45:15
偶是用DEV编译器

一、
定义一个结构
struct aa
{
int no;
char name[20];
struct aa * pNext;
};

二、写函数分配内存空间及写入数据
fu_input( struct aa * pItem)
{
//如果在函数中分配内存空间,超出函数范围后内存就不存在了
pItem = ( struct aa *)malloc( sizeof(struct aa) );
pItem->no=10;
strcpy(pItem->name,"hello");
pItem->pNext = NULL;
}

三、主函数里调用
int main()
{
struct aa * pHeader;
fu_input(pHeader);
//返回主函数后pHeader为空的,printf调用时就会报错
printf("%d,%s",pHeader->no,pHeader->name);

return 0;
}

//但如果偶在主函数里分配内存空间,再调用就没有问题
//调整后函数如下:
fu_input( struct aa * pItem)
{
pItem->no=10;
strcpy(pItem->name,"hello");
pItem->pNext = NULL;
}

//主函数里调用时

pHeader = ( struct aa *)malloc( sizeof(struct aa ));
fu_input(pHeader); //在主函数中分配内存空间就没有问题

现向各位请教一下,在函数fu_input中申请内存空间后,超出函数范围后,该内存空间就不存了吗?
而要在主函数里申请内存空间

这是个什么概念?

小的初学,请各位出手指点



...全文
242 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ribut9225 2007-07-30
  • 打赏
  • 举报
回复
谢谢
结贴
juicee 2007-07-29
  • 打赏
  • 举报
回复
传递指针的引用或者返回分配内存后的指针值。
DonaldKnuth 2007-07-28
  • 打赏
  • 举报
回复
注意指针作为参数传递的概念

struct aa * pHeader; //这里使用前没有初始化
fu_input(pHeader);
//在这个函数调用后pHeader指针根本没有指向你分配的内存,而你分配的内存
//在函数调用完已经泄露了。。。
//原因如下
fu_input( struct aa * pItem)
{
// 你的参数是传递指针的拷贝,而不是引用,而开始
//的pHeader指针是没有初始化,及指向未知内存空间
//这时pItem指向了和pHeader一样的内存空间

pItem = ( struct aa *)malloc( sizeof(struct aa) );
//这条语句只是使pItem指针指向了分配的内存,pHeade指针没有变
//即还是未知内存

pItem->no=10;
strcpy(pItem->name,"hello");
pItem->pNext = NULL;
//函数结束时pItem生命期结束,而没有使用free(pItem)释放内存造成内存
//泄漏, 同时pHeade指针还是指向的最开始的未知内存
}

printf("%d,%s",pHeader->no,pHeader->name);
//由于在fu_input( struct aa * pItem)调用过程中pHeader从未变化
//还是一个未知内存,引用当然会出错

//可以这样小改一下

#include<stdio.h>
#include<malloc.h>
#include<string.h>

struct aa
{
int no;
char name[20];
struct aa * pNext;
};


void fu_input( struct aa * &pItem)//这里改为传递指针的引用
{
pItem = ( struct aa *)malloc( sizeof(struct aa) );
pItem->no = 10;
strcpy(pItem->name,"hello");
pItem->pNext = NULL;
}


int main()
{
struct aa * pHeader;
fu_input(pHeader);

printf("%d,%s",pHeader->no,pHeader->name);
free(pHeader); //最后记得释放空间
return 0;
}

而你的第二个方法不存在pHeader无效的问题,所以可以通过编译。。。。。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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