这两种方法在数据可见性和内存开销方面有何不同(任何其他差异也会很大):
typedef struct student_data_t_ {
char name[30];
int score;
} student_data_t;
void fill_values (student_data_t *data) {
snprintf(data->name, 30, "Howard");
data->score = 20;
return;
}
int main (void) {
student_data_t record;
student_data_t *ptr = NULL;
fill_values(&record); // <1> passing the struct by reference
ptr = (student_data_t *)malloc(sizeof(student_data_t));
if (!ptr) {
printf("NOMEM");
return 0;
}
fill_values(ptr); // <2> passing after allocating memory
if (ptr) {
free(ptr);
}
return 0;
}
答案 0 :(得分:2)
对于局部变量,内存开销将完全存在于该线程的堆栈中。如果你在嵌入式系统中使用大型结构,这可能会成为一个问题,因为你冒着堆栈溢出的风险。通常,您将仅使用请求的字节数,但可以限制堆栈空间。 (我工作的一些应用程序有512字节或更少的堆栈)
在使用malloc的情况下,您正在从堆中分配内存。这避免了堆栈大小问题,但增加了在完成后释放内存的要求。
可见性由存储指针的变量决定。
将局部变量传递给单独的线程是非常危险的,如果局部变量变得无效,可能导致未定义的行为,比如由于函数返回。
答案 1 :(得分:1)
传递本地结构必然会更快,程序可以在编译时做一些有问题的事情。从机器代码的角度来看,本地结构实际上是一个恒定的内存地址。 当你开始使用malloc时,肯定会有处理开销,还有一个空间问题。虽然两种结构都是相同的,但malloc可能会使用&#34;比sizeof(struct)更多的内存只是为了存储数据。 malloc还在每个页面上保留空间以维护和分配内存查找表的内存地址大小,这允许免费只需要一个地址作为参数。
最大的问题之一是开发时间介绍malloc和免费程序增加了错误的机会,尤其是分段错误。没有提到难以追查&#34;隐形&#34;内存泄漏的bug。 但是使用malloc和calloc是处理用户输入的唯一方法,你永远不知道他们将要输入多少数据,一个2kb的文本输入缓冲区可以很容易地通过调用fgets来填充