좀 트릭이 들어간 것 같은데요. int와 void *의 크기 차이가 정확히 2배일 경우에는
{0,PAGE_SIZE}의 값이 구조체로 한번에 복사될 수 있을겁니다. 하지만 그렇지 않고
크기가 같을 경우 {0,PAGE_SIZE} 중 0 값만 복사될 겁니다. 결론적으로 CPU와 (경우에
따라서는) 컴파일러에(도) 매우 의존적인 코드입니다.
해석은 거꾸로 하면 됩니다. {0,PAGE_SIZE}는 두개의 int 값을 갖는 배열입니다.
그 다음 이것을 굳이 (int[2])로 type casting 해 주어 int 2개의 배열임을 명시한
것입니다. C언어는 배열의 크기에 신경쓰지 않으므로 (int[])로 해 줘도 결과는
동일합니다. 그리고 배열의 처음 주소를 & 연산자로 구합니다. 여기까지 하면
배열에 대한 pointer를 구한 것이 됩니다. 따라서 (void **)로 type cast를 해
준 뒤 그 pointer가 참조하는 void *값을 * 연산자를 통해 구한 것입니다. 결국
int 2개의 배열이 void *로 타입 변환되고 void * 값으로 해석된 것입니다.
선언 부분을 조금 더 써주시죠....
저도 헥깔리네요 ㅋ
대충 보면.
(void **) <-- 요건 형변환 연산자..
예를 들어 int *a;
라면 a 번지의 값이 int 형이란 것이죠.
결론 : a는 포인터.
int ** a ;
라면 a번지의 값이 포인터이고 그 포인터 내부의 값이 int형이죠.
결론 a 는 포인터의 포인터.
(void **) &(int[2]) <-- int[2]의 번지(&(int[2]))가. 포인터의 포인터.
따라서 int[2] <-- 포인터가 되죠.
여기서 맨 앞에 * 포인터 연산자가 있으니.
결론은 int[2] 번지의 값 이란 말이네요.
{} 가 붙은 것은 배열 인거 같은데.... 흠..
결론은 pages[0] 를 {0,PAGE_SIZE} 로 초기화 한 것으로 보이는 군요.
음.... 우째 대답이 궁색하네... 재미난 코드군요... 허허.
테스트 해봐야 알겠다는..... 쩝.
뒤에 무언가 붙으면
뒤에 무언가 붙으면 우선순위때문에 달라집니다.
{} 를 배제하면
*(void **) &(kkk[2]); ==> (void *) kkk[2]
와 같습니다.
복잡하게 표현하는건 복잡해 보이지만 보다 명확하다는 것입니다.
함수 포인터 등에서 쓰이는 형식 같은데. 이때에도 {} 아니라 () 를 사용하는데....
한줄 가지고 모르겠군요.
1. int 를 변수가 됩니까?
2. {} <-- 이거 문제 없습니까?
결론 : 그 한줄이 동작은 하는 거 맞나요.
컴파일러 어디에서 그렇게 썼다는 말인가요.
#include #define PAGE_SIZE 8
#include
#define PAGE_SIZE 8
int main()
{
void** a=*(void**)&(int[2]){0,PAGE_SIZE};
void** b=*(void**)&(int[2]){PAGE_SIZE,0};
printf("%x, %x\n",a,b);
return 0;
}
결과 :
0, 8
이네요...
#include #define PAGE_SIZE
#include
#define PAGE_SIZE 8
int main()
{
void** a=*(void**)&(int[2]){0,PAGE_SIZE};
void** b=*(void**)&(int[2]){PAGE_SIZE,0};
printf("%x, %x\n",a,b);
return 0;
}
VC++ 6에서 에러납니다. ㅡ.ㅡ;;
D:\VCprg\Study\mytest7\testcpp.cpp(6) : error C2059: syntax error : '{'
D:\VCprg\Study\mytest7\testcpp.cpp(6) : error C2143: syntax error : missing ';' before '{'
D:\VCprg\Study\mytest7\testcpp.cpp(6) : error C2143: syntax error : missing ';' before '}'
D:\VCprg\Study\mytest7\testcpp.cpp(7) : error C2059: syntax error : '{'
D:\VCprg\Study\mytest7\testcpp.cpp(7) : error C2143: syntax error : missing ';' before '{'
D:\VCprg\Study\mytest7\testcpp.cpp(7) : error C2143: syntax error : missing ';' before '}'
Error executing cl.exe.
뭐 어떻든.
int[2] <-- int형 메모리 두개 할당. 이군요.
{0,PAGE_SIZE} <-- 거기에 들어갈 초기화 데이터.
(void **) <-- 형변환 연산자 포인터의 포인터.
&(int[2]) <-- 준비한 배열의 주소.
* 그것의 값이군요.
배열주소는 배열[0]을 가리키고 있죠.
a[0] == *a
그래서 배열의 첫번째 데이터가 변수에 들어갑니다.
이상이네요.
결론은 int 형 배열 공간 2개 에 { } 의 값을 넣고.
그 첫번째 배열원소의 값을 변수에 넣은 겁니다.
해석은 맞는 거 같은데. VC++에서 에러납니다. 컴파일러는 gcc인가요?
넵
gcc 4.1.3 입니다
int 배열을 void *로 타입 변환하여 저장한 것입니다.
좀 트릭이 들어간 것 같은데요. int와 void *의 크기 차이가 정확히 2배일 경우에는
{0,PAGE_SIZE}의 값이 구조체로 한번에 복사될 수 있을겁니다. 하지만 그렇지 않고
크기가 같을 경우 {0,PAGE_SIZE} 중 0 값만 복사될 겁니다. 결론적으로 CPU와 (경우에
따라서는) 컴파일러에(도) 매우 의존적인 코드입니다.
해석은 거꾸로 하면 됩니다. {0,PAGE_SIZE}는 두개의 int 값을 갖는 배열입니다.
그 다음 이것을 굳이 (int[2])로 type casting 해 주어 int 2개의 배열임을 명시한
것입니다. C언어는 배열의 크기에 신경쓰지 않으므로 (int[])로 해 줘도 결과는
동일합니다. 그리고 배열의 처음 주소를 & 연산자로 구합니다. 여기까지 하면
배열에 대한 pointer를 구한 것이 됩니다. 따라서 (void **)로 type cast를 해
준 뒤 그 pointer가 참조하는 void *값을 * 연산자를 통해 구한 것입니다. 결국
int 2개의 배열이 void *로 타입 변환되고 void * 값으로 해석된 것입니다.
감사합니다
많은 도움이 되었습니다
답변주신분들 감사합니다 ^^*
-------- 시그내쳐 ---------
열심히 열심히 열심히 .. 다
음악을 하는것 처럼!!
-------- 시그내쳐 ---------
열심히 열심히 열심히 ..
음악을 하는것 처럼!!
댓글 달기