首页 > 解决方案 > 在 C 中以下列方式初始化 struct 有什么区别?

问题描述

我正在学习 C. 我有一个如下所示的结构。我看到了 2 种不同的初始化结构变量的方法。如果有人能解释这两种方式之间的区别以及在这种情况下哪种方式更受欢迎,那就太好了。

typedef struct {
  int length;
  int* elements;
} Array;

Array create_array_type_one(int size) {
  
  Array result;
  
  result.length = 0;
  result.elements = (int *)malloc(size * sizeof(int));
  
  return result;
  
}

Array* create_array_type_two(int size) {
  
  Array *array = (Array *) malloc(sizeof(Array));
  
  array->length = 0;
  array->elements = (int *) malloc(sizeof(int) * size);
  
  return array;
  
}

标签: cstructmalloc

解决方案


所以,我们在这里谈论结构和功能

基本上,调用者和被调用的结构函数可以通过三种方法相互通信。

  1. 将结构的每个成员作为函数调用的实际参数传递,或返回每个成员类型。
  2. 将结构的副本发送到整个被调用函数或返回结构类型(按值调用)。
  3. 使用指针,将结构作为参数传递并间接处理原始结构或返回结构的地址(通过引用调用)。

你的,案例1:

Array create_array_type_one(int size) {
  
  Array result;
  
  result.length = 0;
  result.elements = (int *)malloc(size * sizeof(int));
  
  return result;
  
}

在这种情况下,您是returning调用函数的整个结构的副本。因此,为了在您的main()函数中使用它,您应该执行以下操作:

Array new;
new = create_array_type_one(5);

在这里,您将返回的 type 结构分配给 typeArray的结构Array

案例 2 中:

Array* create_array_type_two(int size) {
  
  Array *array = (Array *) malloc(sizeof(Array));
  
  array->length = 0;
  array->elements = (int *) malloc(sizeof(int) * size);
  
  return array;
  
}

在这种情况下,您正在使用指针并返回指向新创建的 type 数据结构的指针Array。您不是将结构的副本发送给调用函数,而是将其地址发送给调用函数。main()因此,在while 调用中发生的情况是:

Array *ptr;
ptr = create_array_type_two(5);

这两种情况都有各自的优点和缺点,例如 CASE 1 确保数据安全,因为被调用函数完成的所有工作都发生在副本上,但使用额外的内存。与以前的方法相比,CASE 2 更高效、更快,因为它使用相同的内存位置进行操作。


推荐阅读