2011-05-12 2 views
3

다른 포인터가 가리키는 데이터를 어떻게 복사합니까?포인터로 데이터 복사

나는 다음과 같은

void *startgpswatchdog(void *ptr) 
{ 
    GPSLocation *destination; 
    *destination = (GPSLocation *) ptr; 

이 올바르게 할 것 있나요?

전달한 데이터를 전달한 후에 스레드로 전달하므로 데이터를 복사해야합니다.

답변

8

데이터를 복사하려면 malloc을 통해 새 메모리를 할당해야하며 memcpy을 통해 메모리를 복사하십시오. 당신이 복사 AE 포인터가 실제로 뭔가를 지적하는 경우

void *startgpswatchdog(void *ptr) 
{ 
    GPSLocation *destination = malloc(sizeof(GPSLocation)); 
    memcpy(destination, ptr, sizeof(GPSLocation)); 
} 
+3

일을 잊지

&destination 

그냥 해달라고 사용

void *startgpswatchdog(void *ptr) { GPSLocation destination; destination = (GPSLocation) *ptr; } 

과를 사용하지만, 대답은 명확하게해야한다는 OP의 코드는'destination'이 초기화되지 않은 포인터이므로 UB를 발생시킵니다. –

+0

좋은 지적 @Oli! –

+0

위에서 언급 한 복사본을 작성한 후에 다른 스레드를 만들 때 GPSLocation을 가리키고 싶다면 어떻게해야합니까? – jarryd

0

당신은 그것을 할 수 있습니다 : 아마도

void *startgpswatchdog(void *ptr) 
{ 
    GPSLocation *destination = malloc(sizeof(GPSLocation)); 
    *destination = * (GPSLocation *) ptr; 
} 

또는 더 나은 : 당신은 당신이 할당하기 전에 메모리를 할당 할 필요가

void *startgpswatchdog(void *ptr) 
{ 
    GPSLocation destination; 
    destination = * (GPSLocation *) ptr; 
} 
+0

두 번째 예제는 특별히 유용한 기능을 수행하지 않습니다 ... –

+0

@Oli 글쎄, 둘 다 첫 번째 않습니다! –

+0

그건 좋은 지적이야 ... –

0

포인터가 가리키는 주소 왜 포인터가 필요합니까? 왜이 변수 주소를 필요로하는 경우 나중에 단지 그에게 지역 변수 :

+0

나는 (void * ptr) 인수로 만든 다른 스레드에 포인터를 전달하기 때문에 – jarryd

+0

로컬 바 - "대상"을 의미한다. – yossi