2017-09-24 87 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]