Kích thước struct và union

Trên đây mình có hai kết quả khi kiểm tra kích thước của kiểu struct và kiểu union.
Theo lý thuyết:

  • kích thước của Struct = Tổng kích thước các thành phần.
  • kích thước của Union = Kích thước thành phần lớn nhất.

Nhưng khi mình kiểm tra bằng lệnh sizeof() thì lại không cho kết quả như lý thuyết.
Không biết có khúc mắc gì hay là tại mình ko đc kiểm tra bằng lênh sizeof().

CẢM ƠN MỌI NGƯỜI.

lý thuyết bạn chế ra à :V

https://en.cppreference.com/w/c/language/object#Alignment

có thể kiểm tra xem struct này có alignment là bao nhiêu thông qua https://en.cppreference.com/w/c/language/_Alignof

ví dụ của người ta:

#include <stdio.h>
#include <stdalign.h>
 
// objects of struct S can be allocated at any address
// because both S.a and S.b can be allocated at any address
struct S {
    char a; // size: 1, alignment: 1
    char b; // size: 1, alignment: 1
}; // size: 2, alignment: 1
 
// objects of struct X must be allocated at 4-byte boundaries
// because X.n must be allocated at 4-byte boundaries
// because int's alignment requirement is (usually) 4
struct X {
    int n;  // size: 4, alignment: 4
    char c; // size: 1, alignment: 1
    // three bytes padding
}; // size: 8, alignment: 4
 
int main(void)
{
    printf("sizeof(struct S) = %zu\n", sizeof(struct S));
    printf("alignof(struct S) = %zu\n", alignof(struct S));
    printf("sizeof(struct X) = %zu\n", sizeof(struct X));
    printf("alignof(struct X) = %zu\n", alignof(struct X));
}

possible output:

sizeof(struct S) = 2
alignof(struct S) = 1
sizeof(struct X) = 8
alignof(struct X) = 4
5 Likes

thêm cái wiki đọc thêm cho kĩ: https://en.wikipedia.org/wiki/Data_structure_alignment

5 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

12 bytes này.

struct T {
  char c1;
  int i;
  char c2;
};

int main() {
   printf("%ull bytes!", sizeof(struct T));
   return 0;
}
//possible output: 12 bytes!
3 Likes

32 bytes nè các bác.

struct X{
    double d;  
    char c;    
    int i;     
    char cs[9]; 
};
4 Likes

12bytes : 32bit - 8byte alignment à ??

Kich thước union là đúng rồi,còn struct là sai nhé,struct lấy kích thước theo thứ tự các biến khai báo trong struct,mình lấy ví dụ struct của bạn phía trên:
struct T {
char c1;
int i;
char c2;
};
int i kích thước lớn nhất 4byte=>kich thước lúc này thay đổi thành bội của 4
biến đầu tiên chiếm 1byte trong block 4byte và dư ra 3bytes,biến thứ 2 int có 4 byte ghép vào ta thấy block 1 chỉ còn 3 bytes ko đủ chứa i=>tạo block 2 =>kich thuoc hiện tại là 8 byte
tiêp là biến c2 là kiểu char 1byte ,nhưng block kề nó đã đầy=>cần mở thêm 1 block 4bytes=> kích thước 12bytes

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?