Проблема порядка байтов в C при передаче по ссылке 32/64 бит - PullRequest
0 голосов
/ 10 марта 2011

Я борюсь с проблемой порядка байтов в следующем примере. В этом случае main () передает адрес 32-битного целого числа, а myfunc () получает его в 64-битном формате.

#include <stdint.h>
#include <stdio.h>

void myfunc(uint64_t *b)    
{    
    printf("%llx\n", *b);    
if ((*b & 255) == 127)    
   printf("\n It works\n");    
else    
    printf("\n Not working\n");    
}

main()    
{    
uint32_t a = 127;    
    printf("\n%lx\n", a);
    myfunc(&a);
}

Работает корректно на платформе с прямым порядком байтов (Windows).

7f
28ff780000007f

Работает

Но он не работает на старшем порядке (AIX).

7f
7fdeadbeef

Не работает

Я думаю, что когда мы передаем 32-битный адрес и получаем в 64-битном, на платформе с прямым порядком байтов он получает в других 32-битных. Но я не уверен. Пожалуйста, помогите мне понять, что происходит за этим. я не могу правильно написать первую строку программы здесь.

Большое спасибо Энн

1 Ответ

5 голосов
/ 10 марта 2011

Прежде всего, ваш код запускает неопределенное поведение.Вы выделяете 32-битную переменную a и затем (в myfunc()) пытаетесь использовать ее, как если бы она была 64-битной - большего размера, поэтому вы фактически пытаетесь получить доступ за пределами юридически распределенной переменной.Это может привести к любым последствиям, и ваша программа просто не может работать правильно, потому что то, что вы пытаетесь сделать, не имеет смысла с точки зрения C Standard.

...