문제

다음 구조물이 있습니다

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()에드 메모리; 힙, 스택 또는 글로벌 공간의 모든 것을 가리킬 수 있습니다.

당신도 ~할 수 있었다 데이터의 크기를 찾아 보면 여전히 알 수 없습니다. 구조 내부 데이터 중 적절한 "딥 카피"가 불가능하다는 것을 의미합니다. 첫 번째 포인터 깊이에서 딥 카피가 멈추지 않습니다.

당신은 옳지 만 구별하십시오 : 당신은 깊은 사본을 만들 수 있지만, 몇 바이트 포인터 포인트 수는 알 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top