2017-09-24 50 views
-1

具有這種類型的結構,如何將一個結構複製到另一個結構中。我宣稱Array firstArray second,然後我啓動了兩個,並在每一個不同的數據。C - 具有動態數組的拷貝結構

然後複製firstsecond我試過second = first但它不起作用。

我該怎麼辦?

#include <stdio.h> 
    #include <stdlib.h> 
    #include <inttypes.h> 


    ////////////////////////////////////// 

    typedef struct { 

     int group[8]; 
     uint64_t points; 

    } BestGroup; 

    ////////////////////////////////////// 

    typedef struct { 
     BestGroup *array; 
     size_t used; 
     size_t size; 
    } Array; 

    void initArray(Array *a, size_t initialSize) { 
     a->array = (BestGroup *)malloc(initialSize * sizeof(BestGroup)); 
     a->used = 0; 
     a->size = initialSize; 
    } 

    void insertArray(Array *a, int *group_add, uint64_t points_add) { 

     // a->used is the number of used entries, because a->array[a->used++] updates a->used only *after* the array has been accessed. 
     // Therefore a->used can go up to a->size 
     if (a->used == a->size) 
     { 
     a->size *= 2; 
     a->array = (BestGroup *)realloc(a->array, a->size * sizeof(BestGroup)); 
     } 

     int i; 
     for (i = 0; i < 8; i++) 
     { 
     a->array[a->used].group[i] = group_add[i]; 
     } 
     a->array[a->used].points = points_add; 
     a->used++; 
    } 

    void freeArray(Array *a) { 
     free(a->array); 
     a->array = NULL; 
     a->used = a->size = 0; 
    } 


    void CopyArray(Array *a, Array *b) 
    { 
     b = a; 
    } 

    int main() 
    { 
     Array first; 
     Array second; 

     int first_data[8] = {0, 1, 2, 3, 4, 5, 6, 7}; 
     int second_data[8] = {7, 6, 5, 4, 3, 2, 1, 0}; 

     initArray(&first, 2); 
     initArray(&second, 2); 

     insertArray(&first, first_data, 5); 
     insertArray(&first, first_data, 5); 
     insertArray(&first, first_data, 5); 

     insertArray(&second, second_data, 2); 

     /////////////////////////////////////////// 

     printf("Total Points: %" PRIu64 "\n", first.array->points); 
     printf("Number: %lu\n\n", first.used); 
     printf("\n"); 

     int i; 
     int j; 

     for (i = 0; i < first.used; i++) 
     { 

      printf("["); 

      for (j = 0; j < 8; j++) 
      { 
      if (j) printf(", "); 
      printf("%d", first.array[i].group[j]); 
      } 

      printf("]\n"); 
     } 

     //////////////////////////////////////////// 

     printf("\n"); 
     printf("Total Points: %" PRIu64 "\n", second.array->points); 
     printf("Number: %lu\n\n", second.used); 
     printf("\n"); 

     for (i = 0; i < second.used; i++) 
     { 

      printf("["); 

      for (j = 0; j < 8; j++) 
      { 
      if (j) printf(", "); 
      printf("%d", second.array[i].group[j]); 
      } 

      printf("]\n"); 
     } 

     ///////////////////////////////// 

     CopyArray(&first, &second); 


     printf("\n"); 
     printf("\n"); 
     printf("\n"); 
     printf("\n"); 

     /////////////////////////////////////////// 

     printf("Total Points: %" PRIu64 "\n", first.array->points); 
     printf("Number: %lu\n\n", first.used); 
     printf("\n"); 

     for (i = 0; i < first.used; i++) 
     { 

      printf("["); 

      for (j = 0; j < 8; j++) 
      { 
      if (j) printf(", "); 
      printf("%d", first.array[i].group[j]); 
      } 

      printf("]\n"); 
     } 

     //////////////////////////////////////////// 

     printf("\n"); 
     printf("Total Points: %" PRIu64 "\n", second.array->points); 
     printf("Number: %lu\n\n", second.used); 
     printf("\n"); 

     for (i = 0; i < second.used; i++) 
     { 

      printf("["); 

      for (j = 0; j < 8; j++) 
      { 
      if (j) printf(", "); 
      printf("%d", second.array[i].group[j]); 
      } 

      printf("]\n"); 
     } 

     return 0; 
    } 

的輸出是:

Total Points: 5 
Number: 3 


[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 

Total Points: 2 
Number: 1 


[7, 6, 5, 4, 3, 2, 1, 0] 




Total Points: 5 
Number: 3 


[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 

Total Points: 2 
Number: 1 


[7, 6, 5, 4, 3, 2, 1, 0] 

當它應該與最後一個列表作爲結束:

Total Points: 5 
Number: 3 


[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 

Total Points: 5 
Number: 3 


[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 

EDIT

如所建議的我使用的memcpy(),所以我將CopyArray()函數更改爲:

void CopyArray(Array *a, Array *b) 
    { 
     // b = a; 
     memcpy(b, a, a->size * sizeof(BestGroup)); 
    } 

它看起來像結果將是罰款,直到它到達程序的結束和輸出

*** stack smashing detected ***

+0

哪裏是在上面的代碼中相應的行?它應該工作,如果他們有相同的類型(你可以嘗試memcpy()已經建議))。 –

+1

您提供的大部分代碼與該問題無關。我們喜歡看代碼,但通常我們需要一個[mcve],在這種情況下,重點是「* minimal *」。但不要忽視「完整」。目前尚不清楚「這不行」的意思,或者你如何確定。特別是,你完全可以使用'='運算符將整個結構的值複製到另一個相同類型的結構中。 –

+0

只需將主要功能添加到問題以及實際和期望的輸出中 – PyCV

回答

1

這段代碼產生你想要的答案。 CopyArray()函數現在釋​​放已在b中的數據,然後初始化b,最後將數據從a複製到b。有些地方的代碼使用8,但應該使用不同的大小變量 - 我已經在代碼中註釋了它們。函數是調試複雜結構時我經常編寫和使用的函數的示例。它需要一個標籤字符串(它允許您識別正在打印的是哪個調用)以及要打印的對象。我也經常採用文件流參數,如有疑問,請爲輸出流添加fflush()

/* SO 4639-4467 */ 
#include <inttypes.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct 
{ 
    int group[8]; 
    uint64_t points; 
} BestGroup; 

typedef struct 
{ 
    BestGroup *array; 
    size_t used; 
    size_t size; 
} Array; 

static void initArray(Array *a, size_t initialSize) 
{ 
    a->array = (BestGroup *)malloc(initialSize * sizeof(BestGroup)); 
    a->used = 0; 
    a->size = initialSize; 
} 

static void insertArray(Array *a, const int *group_add, uint64_t points_add) 
{ 
    if (a->used == a->size) 
    { 
     a->size *= 2; 
     a->array = (BestGroup *)realloc(a->array, a->size * sizeof(BestGroup)); 
    } 

    for (int i = 0; i < 8; i++)  // Why 8 and not points_add? 
    { 
     a->array[a->used].group[i] = group_add[i]; 
    } 
    a->array[a->used].points = points_add; 
    a->used++; 
} 

static void freeArray(Array *a) 
{ 
    free(a->array); 
    a->array = NULL; 
    a->used = a->size = 0; 
} 

static void CopyArray(const Array *a, Array *b) 
{ 
    freeArray(b); 
    initArray(b, a->used); 
    memmove(b->array, a->array, a->used * sizeof(a->array[0])); 
    b->used = a->used; 
} 

static void dump_array(const char *tag, const Array *arr) 
{ 
    printf("Array: %s\n", tag); 
    printf("Total Points: %" PRIu64 "\n", arr->array->points); 
    printf("Number: %lu\n", arr->used); 

    for (size_t i = 0; i < arr->used; i++) 
    { 
     printf("["); 
     for (size_t j = 0; j < 8; j++) // Why 8 and not arr->array[i].points? 
     { 
      if (j) 
       printf(", "); 
      printf("%d", arr->array[i].group[j]); 
     } 
     printf("]\n"); 
    } 
    putchar('\n'); 
} 

int main(void) 
{ 
    Array first; 
    Array second; 

    int first_data[8] = {0, 1, 2, 3, 4, 5, 6, 7}; 
    int second_data[8] = {7, 6, 5, 4, 3, 2, 1, 0}; 

    initArray(&first, 2); 
    initArray(&second, 2); 

    insertArray(&first, first_data, 5); 
    insertArray(&first, first_data, 5); 
    insertArray(&first, first_data, 5); 
    insertArray(&second, second_data, 2); 

    dump_array("first", &first); 
    dump_array("second", &second); 

    CopyArray(&first, &second); 

    printf("\n"); 
    dump_array("first", &first); 
    dump_array("second", &second); 

    return 0; 
} 

從運行此的輸出是:

Array: first 
Total Points: 5 
Number: 3 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 

Array: second 
Total Points: 2 
Number: 1 
[7, 6, 5, 4, 3, 2, 1, 0] 


Array: first 
Total Points: 5 
Number: 3 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 

Array: second 
Total Points: 5 
Number: 3 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7] 
[0, 1, 2, 3, 4, 5, 6, 7]