2013-07-22 1 views
0

Может кто-нибудь объяснить это поведение мне PLS?Преобразовать адрес в долгосрочные переменные результаты в стоимости?

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' указывает, правильно? И вы смущены, почему _that_ является '1234567', правильно? – jogojapan

+0

Да, это правильно! – skylla

+0

Чтобы получить адрес 'pvTest', вы должны указать его адрес:' (long) & pvText'. –

ответ

1

Ваш код содержит неопределенное поведение; стандарт требует , что тип извлекали с помощью va_arg соответствуют типу прошел (по модулю CV-классификаторы, возможно): Вы прошли long и читать void*, так ничего, что делает компилятор правильно.

На практике большинство компиляторов генерируют код, который не выполняет проверку типа . Если на вашей машине long и void* имеют одинаковый размер (и машина имеет линейную адресацию), вы, вероятно, будете в конечном итоге с тем, что вы передали как long. Если размеры отличаются друг от друга, но машина немного ориентирована, вы получаете достаточно маленькое значение, вы можете получить то же значение . Но это отнюдь не гарантировано.

1

Вам просто повезло.

va_start(pvArgument, pcMsg); 

готовится к va_arg(pvArgument,T) извлечь следующую переменную аргумент следующий pcMsg с презумпцией, что она типа T.

Следующий аргумент после pcMsg является фактически long int 1234567; но вы ошибочно извлекаете его как void *, а затем отливаете его до long в lTest. Вам просто повезло, что void * в вашей системе является такого же размера, как long.

(Или, может быть, я имею в виду странно повезло)

 Смежные вопросы

  • Нет связанных вопросов^_^