【发布时间】:2015-12-07 21:34:38
【问题描述】:
假设我有以下 C 代码:
#include <stdio.h>
#include <stdlib.h>
#define NUM_PEOPLE 24
typedef struct {
char **name;
int age;
} person_t;
void get_person_info(person_t *person);
int main(int argc, char **argv) {
for (int i = 0; i < NUM_PEOPLE; i++) {
person_t new_person;
get_person_info(&new_person);
}
return 0;
}
其中get_person_info() 只是填写了传递指针的person_t 结构。是否有必要在main() 内为new_person 分配malloc() 内存?也就是应该行
person_t new_person;
改为
person_t *new_person = (person_t *) malloc(sizeof(person_t));
然后将get_person_info() 更改为接受person_t ** 而不是person_t *?
对不起,如果这个问题令人困惑——我不确定这是否是需要保留内存的情况,因为指向该内存的指针被传递到 get_person_info() 以避免导致分段错误.
【问题讨论】:
-
两者都是正确的。第一个在栈上分配内存,第二个在堆上分配内存。
-
嗯...但是如果 new_person 不会在另一个函数中使用并且仅用于调用
get_person_info()和main()内,那么将其存储在堆栈中而不打扰 @ 是否安全987654335@ing 内存呢? -
两者都有效。要确定哪个更好,需要看看
new_person后面是如何在代码中使用的。 -
当块结束时,堆栈上的对象被销毁。如果您需要完全控制对象的生命周期,则应在堆上为其分配内存。
-
请注意,由于问题是用 C 而不是 C++ 标记的,因此转换
malloc的返回值是多余的。
标签: c pointers segmentation-fault malloc dynamic-memory-allocation