【发布时间】:2021-10-31 17:24:48
【问题描述】:
假设我有一个声明类似于此的结构
typedef struct {
char *name;
int age;
double *numbers; // A pointer to a list of doubles
} Person;
假设我有一个“初始化”函数Person_new,它创建一个新的Person,它将char *name、int age 和double *numbers 作为参数,为新的Person 分配内存并分配其参数值对应新Person的元素。
Person *Person_new(char *name, int age, double *numbers) {
Person *self;
self = malloc(sizeof(Person));
if (self != NULL) {
self->name = name;
self->age = age;
self->numbers = numbers;
}
return self;
}
使用此功能的正确方法是什么?它还应该为结构的元素分配内存吗?我对此的理解是,由于age 不是一个指针,我不应该为此分配任何其他内存(因为我malloc 它时mallocing self)。因此我应该为其他两个参数分配一些内存,因为我的函数只为它们的指针分配了内存。那么,这个mallocs 应该是由使用该功能的人还是来自该功能本身?
【问题讨论】:
-
这取决于您是要存储提供给函数的指针,还是复制它们指向的数据。您的代码执行前者。如果要复制数据,请使用
malloc或strdup。例如,如果您正在解析文本文件并将指针传递给输入缓冲区数据,则需要复制该数据,因为行缓冲区将被覆盖。但是,如果您将字符串文字传递给函数,则可以将指针存储为给定的。 -
@WeatherVane 知识不够,无法批判性分析,这两种方法的优缺点是什么?如果我只是保留指针,然后函数的用户更改了它们指向的内容,那不会让一切都崩溃吗?
-
@Giuppox 这完全取决于你想做什么......你的功能对某些用例很好,而对另一些用例则错误......所以我们不能真正给你答案。
-
OT:你怎么知道
numbers指向的内存中有多少个double.... -
@4386427 在我的实际实现中,还有另一个带有该信息的
int参数
标签: c memory-management malloc