Sự khác nhau giữa struct và union

Struct và Union là 2 cấu trúc dữ liệu do lập trình viên định nghĩa bao gồm các biến với kiểu dữ liệu khác nhau.

Sự khác nhau giữa struct và union

Việc định nghĩa, khai báo biến, truy cập đến các thành phần của struct và union là giống nhau. Tuy nhiên, giữa struct và union có một vài điểm khác nhau:

struct union
Size của struct ít nhất bằng tổng size của các thành phần của struct. Mình sử dụng từ “ít nhất” là vì size struct còn phụ thuộc vào alignment struct.

sizeof(A) = 4 + 10 + 4 = 18 (trong trường hợp struct alignment member = 1 byte)

struct A
{
    int x;
    char s[10];
    float f;
};
Size của union bằng size của thành phần có size lớn nhất trong union.

sizeof(A) = 10 (kích thước của thành phần lớn nhất trong union)

union A
{
    int x;
    char s[10];
    float f;
};
 Tại cùng 1 thời điểm run-time, có thể truy cập vào tất cả các thành phần của struct  Tại cùng 1 thời điểm run-time, chỉ có thể truy cập 1 thành phần của union

Ví dụ struct và union

Ví dụ 1: Biểu diễn thời gian ngày tháng năm, tính size của struct và hiển thị từng thành phần của struct

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

struct date
{
    int d;
    int m;
    long y;
};

void main()
{
    date dat = {4, 4, 2016};
    printf("\nSize of struct: %d", sizeof(date));

    printf("\ndate = %d", dat.d);
    printf("\nmonth = %d", dat.m);
    printf("\nyear = %d", dat.y);

    getch();

}

Kết quả:

struct
struct

Ví dụ 2: Biểu diễn thời gian ngày tháng năm bằng union, tính size của union.

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

union date
{
    int d;
    int m;
    int y;
};

void main()
{
    date dat;

    printf("\nSize of union: %d", sizeof(date));
    dat.d = 24;
    dat.m = 9;
    dat.y = 2014;

    printf("\ndate = %d", dat.d);
    printf("\nmonth = %d", dat.m);
    printf("\nyear = %d", dat.y);

    getch();

}

Kết quả:

union
union
  • Kích thước của union = kích thước lớn nhất của thành phần của union = sizeof(int) = 4
  • Vùng nhớ giành cho union date là 4 byte. Vùng nhớ này sẽ chứa giá trị 24 khi dat.d = 24 được thực hiện. Tiếp đó, 9 sẽ được copy đè vào vùng nhớ này khi dat.m = 9 được thực hiện. Cuối cùng, 2014 được copy đè vào vùng nhớ khi dat.y = 2014 được thực hiện.

Ví dụ 3:

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

union date
{
    int d;
    int m;
    int y;
};

void main()
{
    date dat;

    printf("\nSize of union: %d", sizeof(date));
    
    dat.d = 24;
    printf("\ndate = %d", dat.d);

    dat.m = 9;
    printf("\nmonth = %d", dat.m);

    dat.y = 2014;
    printf("\nyear = %d", dat.y);

    getch();
}

Kết quả:

union
union

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