在主调用函数申请内存还是在被调函数申请内存

phone1126 2013-07-22 12:00:37
目的是在被调函数中给结构体各成员赋值,供主调函数使用结构体成员变量的值。
声明全局的结果体变量:
typedef struct dest_s
{
uint32 a;
uint32 b;
.
.
.
uint64 f;
uint64 g;
} dest_t;
主调函数:
int master_function(int id)
{
dest_t *p = NULL;


}

被调函数:(此函数参数,函数返回值类型可以根据需求添加或删除)
slave_fuction(int pid)
{
dest_t *pp = NULL;


}

疑惑:方法1:在被调函数中malloc struct dest_s内存,再在被调函数中对结构体成员赋值,被调函数返回一个struct dest_s的指针,主调函数调用被调函数得到赋过值的结构体成员各值,并free被调函数申请的内存。但被调函数是被很频繁的调用的,频繁的malloc 是很不好的。
方法2:若在主调函数malloc struct dest_s内存,把malloc的内存首地址指针参数传给被调函数,被调函数再给:结构体变量各成员赋值(在主调函数的申请内存空间的结构体),主调函数也就得到了赋了值得结构体变量,这样怎么写呢?请高手示范一下

例如,方法1的被调函数实现:
dest_t *slave_fuction(int pid)
{
dest_t *pp = NULL;
pp = (dest_t *)malloc(sizeof( dest_t));

//给结构体各成员赋值
pp->a = functon_c(pid); //由functon_c()的返回值给a成员赋值
..............
..............

return pp;
}

主调函数:
int master_function(int id)
{
dest_t *p = NULL;
int pid = id + 5;
int i;
for(i=0;i<7000;i++)
{
p = slave_fuction(pid); //此时主调函数得到了被调函数赋了值的结构体成员变量

//接着是主调函数在对被调函数返回的赋了值的结构体成员变量做数据处理
..............
..............
..............

free(p);
} //end for
retuin ok;
}
方法1这样实现,被调函数是被很频繁的调用的,频繁的malloc 是很不好的,容易出错,
还有其他好方法实现吗? 设想的方法2怎么实现呢,请高手们指点
...全文
519 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjc-chinese 2013-08-09
  • 打赏
  • 举报
回复
举个例子 ,不知是不是你想要的。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
struct testcase{
int id;
char *name;
};
void main(int argc,char *argv[])
{
int flag=0;
struct testcase *dest;
dest = (struct testcase *)malloc(sizeof(struct testcase));
if(dest != NULL)
{
	flag = ChangeValue(dest);
	printf("dest->id:%d and dest->name:%s\n",dest->id,dest->name);
	free(dest);
}
else printf("malloc failed!\n");
}
int ChangeValue(struct testcase *mytest)
{
mytest->id = 1;
mytest->name="sucessfully";
return 1;
}
phone1126 2013-07-23
  • 打赏
  • 举报
回复
哪位请写出方法2code的简要实现呢?
phone1126 2013-07-23
  • 打赏
  • 举报
回复
回复yutaooo,我的想法也是这样,哪位请写出方法2的简要实现?
yutaooo 2013-07-22
  • 打赏
  • 举报
回复
在调用的函数(caller)中分配内存,而不是在被调用函数(callee)中分配会比较好。有这样的一些理由: 1. malloc()与free()能够成对,同时,出现。这样比较容易管理。 2. 收窄callee的功能与职责,使得callee有更大的通用性。 3. 其实,你也未必确定一定在堆上分配的内存,难道不能在栈上? 4. caller也可以是别人的callee,这个内存的分配也许是上级caller传递过来的呢?
qq120848369 2013-07-22
  • 打赏
  • 举报
回复
设计合理就可以,也没那么绝对,看看linux api就知道了。
max_min_ 2013-07-22
  • 打赏
  • 举报
回复
谁调用 ,谁申请, 谁管理!

1,319

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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