C : 깊은 복사 - 공허 포인터가있는 구조
-
19-09-2019 - |
문제
다음 구조물이 있습니다
struct teststruct
{
int *a;
void *data;
};
공허 포인터가 포함 된 깊은 구조 사본을 수행 할 수 있습니까? 나는 얼마나 많은 바이트를 알 수 없다고 가정합니다 data
포인터 포인트? 그래서 나는 지정된 바이트 수를 malloc 할 수없고 memcpy를 할 수 없습니다. 내가 맞아?
해결책
아니요. 무효*가 가리키는 유형을 모르기 때문에 딥 카피가 문제가되지 않습니다.
또한 깊은 사본조차 할 수 없었습니다 a
그것은 단일을 가리킬 수 있기 때문입니다 int
그들의 배열.
일반적으로 C에서는 깊은 사본을 할 수 있기를 원한다면 내용의 데이터 유형을 전달하는 구조가 있습니다. 예를 들어:
struct teststruct {
int a_sz;
enum voidType vt;
int *a;
void *data;
};
그런 다음 사용할 수 있습니다 a_sz
메모리가 얼마나 많은 정수를 지적하는지 알아 내기 위해 a
열거 된 유형으로 구성되었습니다 data
, 기술적으로는 배열 일 수 있으므로 d_sz
또한.
또 다른 속임수는 가지고있는 것입니다 data
다음과 같은 자체 데이터 유형을 전달하는 구조를 가리 킵니다.
typedef struct {
enum voidType vt;
union {
int i;
float f;
double d;
}
} tVoidType;
다른 팁
지적한 데이터의 크기에 대한 정보가없는 경우 void *data
나는 당신 이이 구조물을 성공적으로 복사 할 수 없다고 말할 것입니다.
당신은 맞습니다. 당신은 얼마나 많은 바이트가 할당되었는지 알 수 없습니다. data
. 사실, 당신은 그것을 확신조차 할 수 없습니다 data
~를 가리키다 malloc()
에드 메모리; 힙, 스택 또는 글로벌 공간의 모든 것을 가리킬 수 있습니다.
당신도 ~할 수 있었다 데이터의 크기를 찾아 보면 여전히 알 수 없습니다. 구조 내부 데이터 중 적절한 "딥 카피"가 불가능하다는 것을 의미합니다. 첫 번째 포인터 깊이에서 딥 카피가 멈추지 않습니다.
당신은 옳지 만 구별하십시오 : 당신은 깊은 사본을 만들 수 있지만, 몇 바이트 포인터 포인트 수는 알 수 없습니다.