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
구조의 포인터를 포함하는 메모리 셀을 재 해석하는 것이 맞습니까?
:
'sizeof (int *)'가'sizeof (double *)'와 다른 경우를 예로들 수 있습니까? – mikithskegg
역사적으로, 아주 (아주 아주 오래된) 릭시 기계는 36 비트의 단어와 "태그가 지정된"주소를 가지고 있습니다 : 일반 주소는 32 비트이고 데이터 유형 태그는 4 비트입니다. 따라서 포인터에는 포인터 유형에 대한 정보가 포함되어 있으며 캐스팅 작업은 일반적으로 비트 사본이 아닙니다. 나는 오늘날 비슷한 아키텍처를 가진 CPU가 있는지 모르겠습니다. –
@mikithskegg for'int *'와'double *'모르겠지만 예를 들어 Cray PVP 시스템은'char *'에 64 비트 표현을,'double *'에 32 비트 표현을 가지고 있습니다. – ouah