2012-07-28 2 views
1

구조체에 저장된 일부 데이터를 다른 구조체에 복사하려고합니다. 아래의 코드가 작동합니까 ?? 그것은 권장 되었습니까?구조체를 다른 구조체에 복사

#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)); 
+0

't2 = t1'이 더 정확할 것입니다. 그러나 그러한 포인터를 공유 할 때는주의해야합니다. – DCoder

+1

@DCoder가 말한 것에 정교함.이 경우에는't1.a'와't1.b'의 메모리를 복사하지 않을 것입니다. 그러면 당신은 그 메모리를 가리키는 구조체를 복사 할 것입니다. – rudolph9

+0

올바르게 사용하고 있는지 확인하기 위해,'malloc (100)'은 100 바이트가 아닌 100 바이트를 예약합니다. 일반적으로 명시 적으로하기 위해,'malloc (NUM_ELEMENTS * SIZE_OF_ONE_ELEMENT)'를 볼 수 있습니다. – chris

답변

5

작동 여부는 의도 한대로 다릅니다. 패딩을 포함하여 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); 
+0

아니요 배열 a와 b에 저장된 정수 데이터를 복사해야합니다. – KasraM

+0

그럴 경우, 새로운 메모리를 malloc하고 복사해야합니다. 나는 그것을 내 답변에 추가 할 것입니다. –

+0

복사 기능을 구현하거나 루프를 피하는 방법이 있습니까? – KasraM

관련 문제