Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Chương trình C hiển thị kích thước và offset thành viên struct


Đề bài

Định nghĩa struct và hiển thị kích thước (size) và vị trí offset của các thành viên.

Struct - Tập hợp các biến khác kiểu dữ liệu, nhóm dưới một tên.

Khai báo struct

struct tagname {
    datatype member1;
    datatype member2;
    ...
    datatype memberN;
};

Ví dụ

struct book {
    int pages;
    char author[30];
    float price;
};

Khai báo biến struct (3 cách)

Cách 1: Khi định nghĩa

struct book { ... } b;

Cách 2: Ẩn danh

struct { ... } b;

Cách 3: Tách biệt

struct book { ... };
struct book b;

Khởi tạo và truy cập struct

Dùng toán tử chấm (.) - member operator:

Cách 1: Khởi tạo trực tiếp

struct book b = {100, "balu", 325.75};

Cách 2: Dùng toán tử chấm

struct book b;
b.pages = 100;
strcpy(b.author, "balu");
b.price = 325.75;

Cách 3: Dùng scanf

struct book b;
scanf("%d", &b.pages);
scanf("%s", b.author);
scanf("%f", &b.price);

Chương trình: In size và offset thành viên

#include <stdio.h>
#include <stddef.h>

struct tutorial {
    int a;
    int b;
    char c[4];
    float d;
    double e;
};

int main() {
    struct tutorial t1;
    
    printf("Kích thước 'a' (int): %zu\n", sizeof(t1.a));
    printf("Kích thước 'b' (int): %zu\n", sizeof(t1.b));
    printf("Kích thước 'c' (char[4]): %zu\n", sizeof(t1.c));
    printf("Kích thước 'd' (float): %zu\n", sizeof(t1.d));
    printf("Kích thước 'e' (double): %zu\n", sizeof(t1.e));
    
    printf("Offset 'a': %zu\n", offsetof(struct tutorial, a));
    printf("Offset 'b': %zu\n", offsetof(struct tutorial, b));
    printf("Offset 'c': %zu\n", offsetof(struct tutorial, c));
    printf("Offset 'd': %zu\n", offsetof(struct tutorial, d));
    printf("Offset 'e': %zu\n", offsetof(struct tutorial, e));
    
    printf("Kích thước struct tutorial: %zu\n", sizeof(t1));
    return 0;
}

Kết quả chạy (hệ 64-bit, alignment)

Kích thước 'a': 4
Kích thước 'b': 4
Kích thước 'c': 4
Kích thước 'd': 4
Kích thước 'e': 8
Offset 'a': 0
Offset 'b': 4
Offset 'c': 8
Offset 'd': 12
Offset 'e': 16
Kích thước struct tutorial: 24

Lưu ý: Kích thước và offset phụ thuộc vào kiến trúc (32/64-bit) và quy tắc căn chỉnh (alignment) của trình biên dịch.