我已经组织了具有分配内存的功能的ac项目
例如,我得到了这个结构:
typedef struct t_example{
int x;
int y;
}example;
Run Code Online (Sandbox Code Playgroud)
我创建了这个函数来初始化一个实例:
/**
return value must be freed
*/
example * example_init(){
example *p_example = malloc(sizeof(example));
p_example->x = 42;
p_example->y = 42;
return p_example;
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样调用这个函数
example *p_example = example_init();
Run Code Online (Sandbox Code Playgroud)
但随着我的项目的增长,我发现有时我不需要分配内存,如果我只需要堆栈上的局部变量,但需要初始化它,所以我将init函数更改为:
void example_init(example *p_example){
p_example->x = 42;
p_example->y = 42;
}
Run Code Online (Sandbox Code Playgroud)
所以我可以像这样调用这个函数
example o_example;
example_init(&o_example);
Run Code Online (Sandbox Code Playgroud)
当然,如果我有一个指针,这个功能也可以工作
example *p_example = malloc(sizeof(example));
example_init(p_example);
Run Code Online (Sandbox Code Playgroud)
我的问题是:这是最好的做法:1)提供,将分配内存(并正确记录本),因为它可以很方便进来的情况下的函数,或2),这应该是留给函数的调用者.
我还读到std函数没有动态分配内存,这就是strdup函数不是标准的原因.所以我会说第二种选择是最好的?