簡體   English   中英

在C中復制結構數組

[英]Copying arrays of structs in C

我已經很久沒用C語言了,這讓我發瘋了。 我有一個結構數組,我需要創建一個將一個數組復制到另一個數組的函數(我需要一個精確的副本),但我不知道如何定義函數調用。 我想我需要使用指針,但是當我嘗試它時會給我一個錯誤。

struct group{
    int weight;
    int x_pos;
    int y_pos;
    int width;
    int height;
};

struct group a[4];
struct group b[4];

copySolution(&a, &b);

最后一個聲明給我發錯了。 就像我說的那樣,用C編程已經很久了,所以我現在有點迷失了:(

應該這樣做:

memcpy(&b, &a, sizeof(a));

編輯 :順便說一句:這將節省的拷貝ab

正如JohannesWeiß所說, memcpy()是一個很好的解決方案。

我只想指出你可以復制像普通類型的結構:

for (i=0; i<4; i++) {
    b[i] = a[i]; /* copy the whole struct a[i] to b[i] */
}

這有偽裝不良家庭作業的感覺......總之,給出了預定的通話格式copySolution在原崗位,的適當定義copySolution將如下所示

void copySolution(struct group (*a)[4], struct group (*b)[4])
{
  /* whatever */
}

現在,在copySolution您可以以您喜歡的任何方式復制數組。 要么使用一個循環

void copySolution(struct group (*a)[4], struct group (*b)[4])
{
  const struct group *pb, *pbe;
  struct group *pa;

  for (pa = *a, pb = *b, pbe = pb + sizeof *b / sizeof **b; 
       pb != pbe; 
       ++pa, ++pb)
    *pa = *pb;
}

或使用上面建議的memcpy

void copySolution(struct group (*a)[4], struct group (*b)[4])
{
  memcpy(b, a, sizeof *b);
}

當然,你必須首先決定你希望你的陣列被復制到哪個方向。你沒有提供任何信息,所以每個人都只是得出了一些結論。

在我的情況下,以前的解決方案無法正常工作 例如,@JohannesWeiß的解決方案沒有復制“足夠”的數據(它復制了大約一半的第一個元素)。
所以萬一有人需要一個解決方案,這會給你正確的結果,這里是:

int i, n = 50;
struct YourStruct *a, *b;

a = calloc(n, sizeof(*a));
b = malloc(n * sizeof(*b));
for (i = 0; i < n; ++i) { 
    // filling a
}

memcpy(b, a, n * sizeof(*a)); // <----- see memcpy here

if (a != NULL) free(a);
a = calloc(n*2, sizeof(*a));

memcpy(a, b, n * sizeof(*b)); // <------ see memcpy here again

一些注意事項,我使用calloc作為a,因為在'// fill a'部分我正在進行需要初始化數據的操作。

將它們作為指針傳遞給函數后,編譯器沒有關於數組大小的信息。 因此,您經常需要第三個參數:要復制的數組的大小。

解決方案(沒有任何錯誤檢查)可能是:

void copySolution(struct group* a, struct group* b, size_t size) {
    memcpy(a, b, size * sizeof(*a));
} 

最簡單的方法可能就是

 b=a

雖然使用memcpy()的解決方案也可以。

暫無
暫無

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

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