구조체에 저장된 일부 데이터를 다른 구조체에 복사하려고합니다. 아래의 코드가 작동합니까 ?? 그것은 권장 되었습니까?구조체를 다른 구조체에 복사
#define SIZE 100
struct {
int *a;
int *b;
} Test;
Test t1;
t1.a = malloc(SIZE);
t1.b = malloc(SIZE);
Test t2;
memcpy(t2,t1,sizeof(Test));
구조체에 저장된 일부 데이터를 다른 구조체에 복사하려고합니다. 아래의 코드가 작동합니까 ?? 그것은 권장 되었습니까?구조체를 다른 구조체에 복사
#define SIZE 100
struct {
int *a;
int *b;
} Test;
Test t1;
t1.a = malloc(SIZE);
t1.b = malloc(SIZE);
Test t2;
memcpy(t2,t1,sizeof(Test));
작동 여부는 의도 한대로 다릅니다. 패딩을 포함하여 t1
에서 t2
까지 비트를 복사하지만 물론 뾰족한 값이 아닌 포인터를 복사합니다.
당신이 패딩 비트 신경 쓰지 않는 경우 - 왜 당신이해야 - 간단한 과제
Test t2 = t1;
당신이 포인터를 복사하는 데 필요한 모든 것입니다.
지정 값을 복제하고 복사하려면 코드 나 간단한 할당이 작동하지 않습니다.
먼저 가리키는 메모리 블록을 복사하려면 먼저 크기를 알아야합니다. 포인터로부터 지적 된 메모리 블록의 크기를 알아낼 수있는 (이식 가능한) 방법은 없습니다.
크기가 #define
인 경우 물론 재사용 할 수 있습니다. 그렇지 않으면 할당 된 블록의 크기를 어딘가에 저장해야합니다.
그러나 새로 할당 된 메모리 블록은 복사 할 블록과 주소가 다르므로 t1
에서 t2
까지 포인터를 복사 할 필요가 없습니다.
Test t2;
t2.a = malloc(SIZE); /* be aware that this is bytes, not number of ints */
t2.b = malloc(SIZE);
if (t2.a == NULL || t2.b == NULL) {
/* malloc failed, exit, or clean up if possible */
fprintf(stderr,"Allocation failure, exiting\n");
exit(EXIT_FAILURE);
}
/* malloc was successful in both cases, copy memory */
memcpy(t2.a, t1.a, SIZE);
memcpy(t2.b, t1.b, SIZE);
't2 = t1'이 더 정확할 것입니다. 그러나 그러한 포인터를 공유 할 때는주의해야합니다. – DCoder
@DCoder가 말한 것에 정교함.이 경우에는't1.a'와't1.b'의 메모리를 복사하지 않을 것입니다. 그러면 당신은 그 메모리를 가리키는 구조체를 복사 할 것입니다. – rudolph9
올바르게 사용하고 있는지 확인하기 위해,'malloc (100)'은 100 바이트가 아닌 100 바이트를 예약합니다. 일반적으로 명시 적으로하기 위해,'malloc (NUM_ELEMENTS * SIZE_OF_ONE_ELEMENT)'를 볼 수 있습니다. – chris