Nano Hash - криптовалюты, майнинг, программирование

Обе структурные переменные получают одинаковое значение внутри union

У меня есть объединение с двумя структурными переменными. структура содержит строку (массив символов).

Вот мой код:

#include <stdio.h>
#include <string.h>

int main(void) {
    struct name{
        char name_v[50];
    };

    union myunion{
        struct name a;
        struct name b;
    }x;

    strcpy(x.a.name_v, "HELLO PEEPS");

    printf("%s\t%s", x.a.name_v, x.b.name_v);

    return 0;
}

Поскольку объединение выделяет достаточно памяти для хранения наивысшего значения в данный момент времени, я думал, что name_v только для struct name a будет содержать значение "HELLO PEEPS", а значение struct name b будет содержать '\0'.

Однако вывод приведенного выше кода

HELLO PEEPS        HELLO PEEPS

Но я ожидал, что вместо второго HELLO PEEPS будет отображаться что-то еще (null?).

Получается, что обоим членам союза одновременно назначается одно и то же значение. (???)

Почему это происходит?
Почему я не получаю ожидаемых результатов?
Что я делаю не так, что не приводит меня к этому?

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

17.10.2017

  • @EugeneSh. Думаю, не полностью. Я новичок в C. 17.10.2017
  • Все поля union начинаются с одного адреса. В этом его суть. 17.10.2017
  • Члены профсоюза наложены на память. Это все, что есть. 17.10.2017
  • Популярное использование объединений - это регистры, потому что, поскольку каждый член начинается с одного и того же адреса, вы можете легко установить биты байта. В остальном профсоюзы мало используются. 17.10.2017

Ответы:


1

Объединения позволяют помещать данные в одну и ту же ячейку памяти.

К тому же они не больше самого большого члена.

Вы храните «HELLO PEEPS» в одной структуре и ничего в другой ... тогда чтение одной даст вам то же самое, что и другая. (Они начинаются с одного и того же адреса памяти).

17.10.2017
  • Так что это будет так, когда у нас есть члены одного типа данных, верно? Потому что я видел, что когда у меня есть строка и int внутри объединения, только один из них будет иметь допустимое значение за раз. 17.10.2017
  • Когда у вас есть строка, вы имеете в виду свой char name_v [50]? Все, что делает объединение, - это выделяет память только размера самого большого члена, и при назначении любому члену другие члены могут быть изменены (поскольку все они находятся в одном и том же адресе памяти). 17.10.2017
  • Я действительно понял, как это работает (kind'a): Предположим, у нас есть две строки. В этом случае оба, указывающие на одно и то же место в памяти, дадут одно и то же строковое значение (что произошло в моем случае). Но если у меня есть int и String, тогда оба, указывающие на одно и то же место в памяти, будут давать значение, только если они совместимы, то есть, если адрес хранит строку, то только строковая переменная даст это, а ссылка на переменную int даст некоторые случайные вещи (может быть, адрес памяти), верно ?? 17.10.2017
  • Если вы поместите строку символов в член объединения name_v[50], а другой член будет int, вы получите внутри этого целого числа первую или две буквы (в зависимости от размера int, который зависит от платформы) строки. 17.10.2017
  • буква внутри целого ??? 17.10.2017
  • да. Это C, вы получите байтовое представление кода ascii для букв .. в вашем int. 17.10.2017
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..