-1
具有這種類型的結構,如何將一個結構複製到另一個結構中。我宣稱Array first
和Array second
,然後我啓動了兩個,並在每一個不同的數據。C - 具有動態數組的拷貝結構
然後複製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]
EDIT
如所建議的我使用的memcpy(),所以我將CopyArray()
函數更改爲:
void CopyArray(Array *a, Array *b)
{
// b = a;
memcpy(b, a, a->size * sizeof(BestGroup));
}
它看起來像結果將是罰款,直到它到達程序的結束和輸出
*** stack smashing detected ***
哪裏是在上面的代碼中相應的行?它應該工作,如果他們有相同的類型(你可以嘗試memcpy()已經建議))。 –
您提供的大部分代碼與該問題無關。我們喜歡看代碼,但通常我們需要一個[mcve],在這種情況下,重點是「* minimal *」。但不要忽視「完整」。目前尚不清楚「這不行」的意思,或者你如何確定。特別是,你完全可以使用'='運算符將整個結構的值複製到另一個相同類型的結構中。 –
只需將主要功能添加到問題以及實際和期望的輸出中 – PyCV