union

– Union cũng như kiểu cấu trúc, nó khác ở chỗ : các thành phần của cấu trúc được cấp phát các vùng nhớ khác nhau, còn các thành phần của union được cấp phát 1 vùng nhớ chung.
– Kích thước của union bằng kích thước của thành phần có kích thước lớn nhất.


1. Khai báo union
Cách 1:

union <tên union>
{
<Kiểu dữ liệu> Biến 1;
<Kiểu dữ liệu> Biến 2; 
... 
<Kiểu dữ liệu> Biến n; 
}; 

Cách 2:

typedef union
{
<Kiểu dữ liệu> Biến 1; 
<Kiểu dữ liệu> Biến 2;
... 
<Kiểu dữ liệu> Biến n; 
}<danh sách tên biến>; 

2. Cách truy cập đến phần tử trong union
Tương tự như truy cập đến các phần tử trong struct.
Ví dụ 1: Kích thước của union = kích thước của thành phần lớn nhất của union

#include <conio.h>
#include <stdio.h>
typedef union
{
    char c;
    int arr[10];
}UNION;

void main()
{
    UNION m;
    printf("\n kich thuoc cua union = %d",sizeof(m));
    printf("\n kich thuoc cua mang arr[10] = %d", sizeof(m.arr));
    getch();
}

Kết quả:

kich thuoc cua union = 40

kich thuoc cua mang arr[10] = 40

Ví dụ 2: Xung đột dữ liệu khi dùng kiểu union

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

union Data
{
    int i;
    float f;
    char  str[20];
};

void main()
{
    union Data data;
    data.i = 10;
    data.f = 220.5;
    strcpy( data.str, "C Programming");

    printf( "data.i : %d\n", data.i);
    printf( "data.f : %f\n", data.f);
    printf( "data.str : %s\n", data.str);

    getch();
}

Kết quả:

data.i : 1917853763

data.f : 4122360580327794860452759994368.000000

data.str : C Programming

– Kích thước tối đa của union Data = kích thước của mảng str = 20 byte.
– Khi ta gán data.i = 10,ta lại tiếp tục gán data.j = 220.5 thì giá trị này sẽ được copy đè lên biến i, câu lệnh gán cuối cùng sẽ chuỗi “C Programming” sẽ được copy đè lên biến j. Kết quả cuối cùng là giá trị của biến i và j sẽ không chính xác.

Tiếp theo, các bạn có thể xem ví dụ dưới đây để biết khi nào sử dụng union.
Ví dụ 3:

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

union Data
{
    int i;
    float f;
    char  str[20];
};

void main()
{
    union Data data;

    data.i = 10;
    printf( "data.i : %d\n", data.i);

    data.f = 220.5;
    printf( "data.f : %f\n", data.f);

    strcpy( data.str, "C Programming");
    printf( "data.str : %s\n", data.str);

    getch();
}

Kết quả:

data.i : 10

data.f : 220.500000

data.str : C Programming

Ta thấy, tại một thời điểm trong chương trình chỉ có 1 thành phần của union được sử dụng.

Be the first to comment

Leave a Reply