Разные адреса указателя и массива в объединении - PullRequest
1 голос
/ 20 марта 2019

Я хочу получить адрес первого элемента массива.Этот массив объединен с указателем.

Код:

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

union l_array_0_uint8_t {
  uint8_t *pnt;
  uint8_t array[8];

};

int main()
{
    union l_array_0_uint8_t u;
    uint8_t* aa = &(u.array[0]);
    uint8_t* pa = u.pnt;
    printf("array   inner: %p\n", aa);
    printf("Pointer inner: %p\n", pa);
    return 0;
}

Результат:

array   inner: 0x7ffdad959050
Pointer inner: 0x7ffdad959140

Почему эти два адреса различаются?Я ожидал, что массив и указатель будут иметь один и тот же адрес.

1 Ответ

3 голосов
/ 20 марта 2019

Результат выражения u.pnt не является адресом члена объединения u.pnt. Это ценность участника. Но член имеет неопределенное значение, поэтому ваша программа имеет неопределенное поведение.

Чтобы получить адрес, вы можете использовать оператор адреса (точно так же, как когда вы взяли адрес другого участника):

uint8_t** pa = &u.pnt;
...