2014-07-06 10 views
1

나는 mystery 멤버는 다음과 같습니다 재산의 종류를 이해하지 않습니다구조체의 void * 멤버를 갖는 것은 무엇을 의미합니까?

void 멤버 멤버의 어떤 종류의
typedef struct _myobject 
    { 
     long number; 
     void *mystery; 
    } t_myobject; 

? 얼마나 많은 기억이 들어 맞습니까? 어디에서 무엇을 그 수행에 대한 자세한 정보를 얻을 수 있습니다 (왜 하나는 void 멤버를 사용하는 것, 예를 들면?)를

EDIT-- 업데이트 제목이 말을 무효 *

+1

구조체 태그를 잊어 버리면, 단지 'void * mystery;'라고 가정하십시오. 이제 같은 질문을하십시오. –

+1

불법적 인 'void'멤버가 없으므로, 여러분은'void *'를 의미했습니다. 'void'는 불완전한 타입이고'union'과'struct' (마지막 멤버로)에서 허용되는 불완전한 타입의 유일하게 가능한 멤버는 완전한 타입의 불완전한 배열 타입입니다. – Deduplicator

답변

2

void* 변수는 메모리의 주소에 대한 "일반"포인터입니다.

필드 mystery 자체는 메모리에 sizeof(void*) 바이트를 사용합니다.이 시스템의 시스템 (가상 메모리 주소 공간의 크기에 따라 정확함)에 따라 일반적으로 4 또는 8이 사용됩니다. 그러나 다른 양의 메모리를 소비하는 다른 객체를 가리킬 수 있습니다.

몇 가지 예문 : 유형 void *

int var; 
char arr[10]; 
t_myobject obj; 

obj.mystery = &var; 
obj.mystery = arr; 
obj.mystery = malloc(100); 
1

귀하의 struct 선언 void *를 말합니다, 당신의 질문은 말한다 void. void 포인터 멤버는 런타임에 알려진 조건에 따라 올바른 포인터 유형으로 캐스팅되는 모든 종류의 데이터에 대한 포인터입니다.

void 회원이 "불완전 유형"오류입니다.

1

잘못된 질문 헤더. 회원은 '무효'가 아니라 '무효 *'입니다. 아무 것도 아닌 포인터.

0

변수가 어떤 심볼의 주소를 저장할 수 있습니다. 이 변수에 대한 할당은 직접 수행 할 수 있지만 역 참조는 실제 유형으로 유형 변환해야합니다. 이것은 역 참조하는 동안 얼마나 많은 메모리 바이트에 액세스해야하는지 컴파일러에 알리는 데 필요합니다. 데이터 유형은 변수의 크기를 알려주는 유형입니다. 처음에 가변 inta의 위의 예에서

int a = 10; 
char b = 'c'; 
void *c = NULL; 
c = &a; 
printf("int is %d\n", *((int*)c)); 
c = &b; 
printf("char is %c\n", *(char*)c)); 

은 포인터 변수 voidc 저장 어드레스. 따라서 void 포인터를 c으로 역 참조하는 동안 int *으로 유형이 변환되었습니다. 이 값을 얻기 위해 4 바이트 (int 크기)에 액세스하도록 컴파일러에 알립니다. 그리고 나서 두 번째로 printfchar *으로 typecasted됩니다. 이것은 값을 얻기 위해 1 바이트 (char 크기)에 액세스하도록 컴파일러에 알리는 것입니다.