gpt4 book ai didi

C - 使用动态数组复制结构

转载 作者:行者123 更新时间:2023-11-30 19:07:51 25 4
gpt4 key购买 nike

有了这种类型的结构,如何将一个结构复制到另一个结构中。我首先声明了数组,然后声明了数组,然后初始化了这两个数组,并在每个数组中放入了不同的数据。

然后将first复制到second我尝试了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]

编辑

按照建议,我使用了 memcpy(),因此我将 CopyArray() 函数更改为:

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

看起来结果会很好,直到到达程序末尾并输出

*** 检测到堆栈崩溃 ***

最佳答案

此代码产生您想要的答案。 CopyArray()函数现在释​​放 b 中已有的数据,然后初始化b ,最后复制 a 中的数据至b 。代码中有些地方使用了8但可能应该使用不同的变量来表示大小——我已经在这段代码中对它们进行了注释。 dump_array() function 是我在调试复杂结构时经常编写和使用的函数示例。它需要一个标签字符串(它允许您识别正在打印的调用)加上要打印的对象。我也经常采用文件流参数,如有疑问,请添加 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]

关于C - 使用动态数组复制结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46394467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com