Разница между структурой и союзом - PullRequest
381 голосов
/ 06 декабря 2008

Есть ли хороший пример, чтобы дать разницу между struct и union? В основном я знаю, что struct использует всю память своего члена, а union использует наибольшее пространство памяти членов. Есть ли другая разница в уровне ОС?

Ответы [ 15 ]

3 голосов
/ 04 января 2018

В чем разница между структурой и объединением?

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

struct s_tag
{
   int a; 
   long int b;
} x;

union u_tag
{
   int a; 
   long int b;
} y;

Здесь есть два члена внутри структуры и объединения: int и long int. Объем памяти для int составляет 4 байта, а объем памяти для длинных int составляет 8 в 32-разрядной операционной системе.

Таким образом, для структуры 4 + 8 = 12 байтов будет создано, а 8 будет создано для объединения

Пример кода:

#include<stdio.h>
struct s_tag
{
  int a;
  long int b;
} x;
union u_tag
{
     int a;
     long int b;
} y;
int main()
{
    printf("Memory allocation for structure = %d", sizeof(x));
    printf("\nMemory allocation for union = %d", sizeof(y));
    return 0;
}

Ссылка: http://www.codingpractise.com/home/c-programming/structure-and-union/

3 голосов
/ 13 июля 2014

Использование союза Союзы часто используются, когда нужны разговоры специального типа. Чтобы получить представление о полезности объединения. Стандартная библиотека c / c не определяет функции, специально предназначенные для записи коротких целых чисел в файл. Использование fwrite () влечет за собой чрезмерные издержки для простой операции. Однако, используя объединение, вы можете легко создать функцию, которая записывает двоичный файл с коротким целым числом в файл по одному байту за раз. Я предполагаю, что короткие целые числа имеют длину 2 байта

ПРИМЕР:

#include<stdio.h>
union pw {
short int i;
char ch[2];
};
int putw(short int num, FILE *fp);
int main (void)
{
FILE *fp;
fp fopen("test.tmp", "wb ");
putw(1000, fp); /* write the value 1000 as an integer*/
fclose(fp);
return 0;
}
int putw(short int num, FILE *fp)
{
pw word;
word.i = num;
putc(word.c[0] , fp);
return putc(word.c[1] , fp);
}    

хотя putw () я вызывал с коротким целым числом, было возможно использовать putc () и fwrite (). Но я хотел показать пример того, как можно использовать профсоюз

3 голосов
/ 30 июня 2014

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

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

struct emp
{
    char x;//1 byte
    float y; //4 byte
} e;

общий объем памяти => 5 байт

union emp
{
    char x;//1 byte
    float y; //4 byte
} e;

общий объем памяти = 4 байта

1 голос
/ 21 октября 2017

Объединение отличается от структуры, так как объединение повторяется над остальными: оно переопределяет одну и ту же память, в то время как структура определяет одно за другим без перекрытий или переопределений.

1 голос
/ 04 ноября 2013

Объединения пригодятся при написании функции упорядочения байтов, которая приведена ниже. Это невозможно с помощью структур.

int main(int argc, char **argv) {
    union {
        short   s;
        char    c[sizeof(short)];
    } un;

    un.s = 0x0102;

    if (sizeof(short) == 2) {
        if (un.c[0] == 1 && un.c[1] == 2)
            printf("big-endian\n");
        else if (un.c[0] == 2 && un.c[1] == 1)
            printf("little-endian\n");
        else
            printf("unknown\n");
    } else
        printf("sizeof(short) = %d\n", sizeof(short));

    exit(0);
}
// Program from Unix Network Programming Vol. 1 by Stevens.
...