簡體   English   中英

通過結構將整個數組分配給C中的另一個數組

[英]Assign whole array into another array in C via a struct

我是一名學生,我將在學校做有關陣列的演講。 我有應該將整個數組分配給另一個數組的代碼。

#define MAX 10
#include <stdio.h>

typedef struct {
    int data[MAX];
} INT_ARR;

int main()
{
    int i;
    INT_ARR arr1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    INT_ARR arr2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    arr1 = arr2;

    return 0;
}
  • 如何在實際項目中使用此技術?
  • 我該怎么辦?
  • 優缺點都有什么?

優點

  • 分配很簡單。 您只需編寫最少的代碼,編譯器即可完成所有工作。
    作為程序員,您很難在正確性和性能上犯錯誤。 機器不會出錯,並且編譯器在優化方面比人類要好得多。
  • 不需要函數調用。
    一般來說,函數調用很慢。 有時候優化器可以擺脫它們,但是在保留代碼可維護性的同時擺脫它們並不是一件壞事。
  • 當用作局部變量時,該數組存儲在堆棧中。
    分配很快,重新分配很快。

缺點

  • 分配很簡單。 您只需編寫最少的代碼,編譯器即可完成所有工作。
    顯然,這樣的分配是相當昂貴的操作。 當然比簡單的int賦值更昂貴。 混淆您未來的自我或項目的其他貢獻者是不好的。
  • 鍵入arr1.data[i]比鍵入arr1[i]更令人討厭。
  • 當用作局部變量時,該數組存儲在堆棧中。
    因此,它必須很小。 否則,將導致堆棧溢出。
  • 與C99 可變長度數組不同 ,這些數組的長度在編譯時定義。
  • 您很少需要這個。
    與分配的集體能力固定寬度的微小的數組是沒有在實踐中非常有用的。 如果您遇到他們的實際應用程序,請在對其描述的評論中@ping我,我將很感興趣。

我想寫更多關於最后一點的信息。

基本上,您具有在編譯時已知的固定d的d維向量。 如果d可以在程序的將來版本中進行更改,這可能會很有用,但是我想這是極不可能的情況,並且在這種應用程序中純結構會更好。 普通結構是指結構不僅僅用作單個數組的最小包裝; 確保它們仍可以包含數組作為成員。

您還需要復制數組的各個部分並分別分配它們的功能。 memcpy()函數memcpy()目的。 您甚至可以將其與結構中的數組一起使用,例如本問題中的數組。

查看數組分配的另一種方法是通過指針。 有時,您不需要兩個不同的內存塊,而只需要幾個名稱。 在這種情況下,應該使用指向內存的指針,從而避免復制數組。 指針分配既快速又簡單。

對代碼的其他說明

  • 初始化程序應使用大括號

     INT_ARR arr2 = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}; 

    外部的用於結構,內部的用於數組。

  • 在您的代碼中,有一個未使用的int i 我猜這是測試您的代碼的遺物。
  • 在C語言中,應使用int main(void)而不是int main() 后者是不建議使用的語法,在將來的C版本中可能會刪除。在函數聲明(而不是定義)中,空括號表示“我什么也沒說參數”。 使用此方法代替顯式的void會導致非常不愉快的驚喜。
  • 您應該選擇更具描述性的標識符,最好是英文標識符 即使您不是講英語的人。 因此,您可以使其他人與您合作。 編輯了您的問題以改善命名約定。

沒有“一個真實的答案”。 這取決於您想做什么。 實際上,除了一些基礎學校項目之外,您可能不會在實際編程中使用它。

正如Sam所說,您應該使用memcpy() 我唯一想到的缺點是代碼性能。 在這里找到更多。

暫無
暫無

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

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