Значение из указателя отображается неправильно - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь присвоить некоторую информацию для данных 'char' (одна структура и одно целочисленное значение), но после того, как я назначу ее, я не могу прочитать ее обратно.Любое решение?Я работаю на Ubuntu 16.04, установленной на virtualbox

struct opcode_struct{
    uint8_t a;
    uint8_t b;
    uint8_t c;
    uint8_t d;
};

union opcode{
    uint32_t uint32code;
    struct opcode_struct code;
};

struct request{
    //4
    union opcode opc;
    //4
    uint32_t id;
};


int main()
{
    char *buff = (char*)malloc(32);

    struct request rq = {0x00000001, 0}, *ptr_rq = &rq;
    int val = 512, *ptr_int = &val;

    memcpy(buff, ptr_rq, sizeof(rq));
    memcpy((buff+sizeof(rq)), ptr_int, sizeof(int));

    printf("Request opcode: 0x%08x\n", *buff);
    printf("Request id: %d\n", *(buff+sizeof(uint32_t)));
    printf("Int value: %d\n", *(buff+sizeof(rq)));

    free(buff);
    return 0;
}

Отображаемый текст: Код операции запроса: 0x00000001 Идентификатор запроса: 0 Int значение: 0

, но значение Int должно быть равно '512'

1 Ответ

0 голосов
/ 18 июня 2019

Вы разыменовываете buff+sizeof(rq), что является char *.Поскольку 512 равно 0x 02 00, если вы разыменуете его как char *, вы получите 0x00.Если вы посмотрите на buff+sizeof(rq) + 1, вы получите другой 0x02.

С другой стороны, если вы наведете указатель на int *, тогда вы получите полное значение 0x0200.

printf("Int value: %d\n", *(int *)(buff+sizeof(rq)));

выходы 512.

...