Đề 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.