2013-07-22 5 views
0

아무도 나 에게이 행동을 설명 할 수 있습니까? 나는이 같은 주에이 함수를 호출하면주소를 long - variable 결과를 값으로 변환 하시겠습니까?

static short nDoSomething(const char* pcMsg, ...) 
{ 
    va_list pvArgument; 
    long lTest; 
    void* pvTest = NULL; 

    va_start(pvArgument, pcMsg); 

    pvTest = va_arg(pvArgument, void*); 
    lTest = (long) pvTest; 

    va_end(pvArgument); 
    return 0; 
} 

는 :

int main(int argc, char* argv[]) 
{ 
    char acTest1[20]; 
    nDoSomething("TestMessage", 1234567L, acTest1); 


    return 0; 
} 

나는 pvTest의 주소가 lTest에있을 것이라고 생각하지만, 사실은 ... 1234567 포함

이것이 어떻게 가능한지?

+1

_of_'pvTest' 주소를 말할 때 :'pvTest' 주소가 가리키고 있습니까? 그리고 왜 당신이 '1234567'이라는 것을 왜 혼란 스럽습니까? 맞습니까? – jogojapan

+0

네 맞습니다! – skylla

+0

'pvTest'의 주소를 얻기 위해서는'(long) & pvText' 주소를 가져야합니다. –

답변

1

귀하의 코드가 정의되지 않은 동작을 포함; 표준이 va_arg를 사용하여 추출 유형 (아마, 모듈 이력서 - 예선) 통과 유형 에 대응 가 필요합니다 당신은 long을 통과하고, 는 void*을 읽고, 그래서 컴파일러가하는 것도 올바른 것입니다.

실제로 대부분의 컴파일러는 검사를 수행하지 않는 코드를 생성합니다. 컴퓨터에있는 longvoid*의 크기가 인 경우 (컴퓨터에 선형 주소 지정이있는 경우) 은 long으로 전달하면됩니다. 두 가지 크기가 다르지만 컴퓨터가 리틀 엔디안이고 값이 충분하지 않은 경우 동일한 값인 으로 끝날 수 있습니다. 그러나 이것이 보장되는 것은 아닙니다.

1

여기에서 운이 좋을 것입니다.

va_start(pvArgument, pcMsg); 

는 유형 T이다 추정에 pcMsg에 따라 다음 변수 인수를 추출 va_arg(pvArgument,T) 준비합니다.

pcMsg 다음의 인수는 실제로 long int 1234567입니다. 그러나 잘못 입력하면 void *이 표시되고 longlTest이됩니다. 시스템에서 void *이 이고 크기가 long 인 것이 운이 좋았습니다.

(아니면 내 말은 이상한 불운)