2012-02-09 4 views
0

C 언어는 struct에 대한 포인터를 void *으로 변환 할 수 있으며 그 반대의 경우도 마찬가지입니다. 또한이 언어는 정의되지 않은 경우에도 struct에 대한 포인터를 정의 할 수 있습니다. 컴파일러는 이러한 구조체에 대해 아무 것도 모르기 때문에 포인터는 동일한 물리적 표현을 가져야합니다. 의 두 개의 별도의 모듈로이 라인을 살펴 보자 :구조체 및 캐스트에 대한 포인터

/* FILE1.c */ 
void *mem = ...; //Points to a suitable memory block 
struct s1 *p1; //No implementation given for struct s1 
void *mem2; 

p1 = (struct s1 *)mem; 
mem2 = &p1; 


/* FILE2.c */ 
extern void *mem2; 
struct s2 { /*...fields...*/ }; 
struct s2 *p2; 

p2 = *(struct s2 **)mem2; 

제공, 모든 플랫폼에서 작동 할 수이 코드가 메모리 블록 (예를 들어 malloc(sizeof(struct s2))에 의해 할당) struct s2를 포함 할 수있을만큼 충분히 큰지?

즉, struct s2에 대한 포인터 인 것처럼 struct s1 구조의 포인터를 포함하는 메모리 셀을 재 해석하는 것이 맞습니까?

:

답변

2

처럼 사용 : 당신은 할 수 있습니다.

sizeof (int *)은 예를 들어 sizeof (double *)과 다를 수 있음을 의미합니다.

유일한 요구 사항은 다음과 같습니다

  • void *, char *, signed char *unsigned char *가 같은 표현이있다.

  • 구조체에 대한 포인터는 동일한 표현을 갖습니다.

  • 노동 조합에 대한 포인터는 동일한 표현을 사용합니다.

+0

'sizeof (int *)'가'sizeof (double *)'와 다른 경우를 예로들 수 있습니까? – mikithskegg

+0

역사적으로, 아주 (아주 아주 오래된) 릭시 기계는 36 비트의 단어와 "태그가 지정된"주소를 가지고 있습니다 : 일반 주소는 32 비트이고 데이터 유형 태그는 4 비트입니다. 따라서 포인터에는 포인터 유형에 대한 정보가 포함되어 있으며 캐스팅 작업은 일반적으로 비트 사본이 아닙니다. 나는 오늘날 비슷한 아키텍처를 가진 CPU가 있는지 모르겠습니다. –

+0

@mikithskegg for'int *'와'double *'모르겠지만 예를 들어 Cray PVP 시스템은'char *'에 64 비트 표현을,'double *'에 32 비트 표현을 가지고 있습니다. – ouah

0

예, 당신이 옳다 (면책 조항 내 질문은 이론적,이 포인터로 재생하는 아주 이상한 방법이라는 것을 완벽하게 알고있다). 모든 포인터는 동일한 크기와 구조를가집니다. 그들은 컴파일러의 "마음"에서만 다릅니다.

+0

이것은 사실이 아니며 포인터 유형에 동일한 표현이 필요하지 않습니다. – ouah

0

예, 가능합니다.

포인터는 표현식으로 모든 데이터 유형의 메모리 위치 주소를 보유하는 정수입니다.

0

일부 데이터를 추출 할 때 유용 할 수 있습니다.

struct s1 
{ 
    char header[4]; 
    int type; 
    char data_max[200]; 
}; 

struct s1_type1 
{ 
    char header[4]; 
    int type; 
    char data_of_some_implementation[80]; 
    char data_of_other_implementation[120]; 
}; 

를 그리고 포인터가 같은 크기 나 표현이 필요하지 않습니다, C에서이

struct s1 data; 
int nb = read(fd, &data, sizeof(data)); 
if (nb == sizeof(data)) 
{ 
    if (data.type == 1) 
    { 
    do_something_special((struct s1_type1*)&data); 
    } 
} 
관련 문제