簡體   English   中英

在 C 中以下列方式初始化結構有什么區別?

[英]What is the difference between initializing struct in following ways in C?

我正在學習 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;
  
}

所以,在這里我們談論的是結構和功能

基本上,調用者和被調用結構 function 可以通過三種方法相互通信。

  1. 將結構的每個成員作為 function 調用的實際參數傳遞,或返回每個成員類型。
  2. 將結構體的副本發送到整個稱為 function 或返回結構體類型(按值調用)。
  3. 使用指針,將結構作為參數傳遞並間接處理原始結構或返回結構的地址(通過引用調用)。

你的,案例1:

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

在這種情況下,您將整個結構的副本returning給調用 function。 所以,為了在你的main() function 中使用它,你應該這樣做:

Array new;
new = create_array_type_one(5);

在這里,您將返回的Array類型的結構分配給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;
  
}

在這種情況下,您使用指針並返回指向新創建的Array類型數據結構的指針。 您不會將結構的副本發送到調用 function,而是將其地址發送到調用 function。 因此,這樣調用時main()中發生的事情是:

Array *ptr;
ptr = create_array_type_two(5);

這兩種情況都有各自的優點和缺點,例如 CASE 1 確保數據安全,因為調用的 function 所做的所有工作都發生在副本上,但使用了額外的 memory。 與以前的方法相比,CASE 2 更高效、更快,因為它使用相同的 memory 位置進行操作。

它們的區別在於返回類型。
create_array_type_one() 返回數組類型 memory 位置。
create_array_type_two() 返回指向數組類型 memory 位置的指針。

由於 Array 類型只有 int 和 int * 兩個元素,所以兩者的大小差別不大。 因此,在這種情況下,您可以使用任何人作為您的編碼偏好。 如果結構的大小有點大,我想向您推薦第二個...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM