Использование указателей и объединение

0

Я только начал изучать C. Я думаю, что я сделал что-то не так с указателем здесь или не понял смысла этого. Посмотрите:

#include <stdio.h>

union Uniao{
int i;
float f;
char c[4];
};
void test(union Uniao *uniao);
int main(){
union Uniao uniao;
printf("uniao.i: %x\n"
    "uniao.f: %x\n"
    "uniao.c: %x\n",
    &uniao.i, &uniao.f,&uniao.c);
test(&uniao);
}
void test(union Uniao *uniao){
printf("uniao.i: %x\n"
    "uniao.f: %x\n"
    "uniao.c: %x\n",
    uniao->i, uniao->f,uniao->c);
}

Как я понял, указатель указывает на расположение памяти исходной переменной. Таким образом, вывод с использованием указателя должен совпадать с выходом с использованием исходной переменной. Но мой результат выглядит примерно так:

uniao.i: bfeac1dc
uniao.f: bfeac1dc
uniao.c: bfeac1dc
uniao.i: b77abff4
uniao.f: 80000000
uniao.c: beef57fe

Что-то не так с моим указателем, или я его неправильно понял?

  • 0
    Пожалуйста, объясните свои намерения, попробуйте описать, чего вы хотите достичь.
  • 0
    Ваш союз не инициализирован
Показать ещё 1 комментарий
Теги:

4 ответа

6
Лучший ответ

В первом случае вы печатаете адрес каждого члена союза. Будучи членами союза, все они имеют одинаковый адрес. Внутри функции вы печатаете значения элементов. (Что, имея разные типы, приведет к нечетным результатам здесь.) Добавление & перед каждым unaio во втором вызове printf даст вам ожидаемые результаты.

  • 0
    Вы правы, спасибо. Хотя мне нужно было использовать *, чтобы указатель напечатал значение, но я только что проверил то, что вы сказали, и это сработало. Я приму ваш ответ через 3 минуты
0

Включите предупреждения на своем компиляторе, чтобы он рассказывал вам, что он думает о вашем коде. Он должен найти около шести или около того плохих ошибок.

  • 0
    Вы правы. Поскольку это показывает некоторые предупреждения, я думал, что они уже были включены.
0

В вашем первом заявлении printf в основном вы используете "&", который возвращает адрес каждого члена (все должно быть одинаковым для объединения), но в функции "Тест" вы передаете значения каждого члена союза по адресам, т.е. &". Вот почему вы получаете разные выходные значения.

  • 0
    да, хотя мне нужно было использовать *, чтобы указатель напечатал значение, спасибо
0

main() форматирует адреса памяти членов профсоюза, тогда как test() вместо этого форматирует значения членов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню