通过引用传递struct与malloc之后传递

时间:2015-03-18 20:27:41

标签: c struct malloc

这两种方法在数据可见性和内存开销方面有何不同(任何其他差异也会很大):

  1. 通过引用传递本地结构
  2. 将指针传递给已分配的内存
  3. 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;
    }
    

2 个答案:

答案 0 :(得分:2)

对于局部变量,内存开销将完全存在于该线程的堆栈中。如果你在嵌入式系统中使用大型结构,这可能会成为一个问题,因为你冒着堆栈溢出的风险。通常,您将仅使用请求的字节数,但可以限制堆栈空间。 (我工作的一些应用程序有512字节或更少的堆栈)

在使用malloc的情况下,您正在从堆中分配内存。这避免了堆栈大小问题,但增加了在完成后释放内存的要求。

可见性由存储指针的变量决定。

将局部变量传递给单独的线程是非常危险的,如果局部变量变得无效,可能导致未定义的行为,比如由于函数返回。

答案 1 :(得分:1)

传递本地结构必然会更快,程序可以在编译时做一些有问题的事情。从机器代码的角度来看,本地结构实际上是一个恒定的内存地址。 当你开始使用malloc时,肯定会有处理开销,还有一个空间问题。虽然两种结构都是相同的,但malloc可能会使用&#34;比sizeof(struct)更多的内存只是为了存储数据。 malloc还在每个页面上保留空间以维护和分配内存查找表的内存地址大小,这允许免费只需要一个地址作为参数。

最大的问题之一是开发时间介绍malloc和免费程序增加了错误的机会,尤其是分段错误。没有提到难以追查&#34;隐形&#34;内存泄漏的bug。 但是使用malloc和calloc是处理用户输入的唯一方法,你永远不知道他们将要输入多少数据,一个2kb的文本输入缓冲区可以很容易地通过调用fgets来填充