Lấy ví dụ sau đây:Hành vi không xác định với tính năng nhập kiểu?
typedef struct array_struct {
unsigned char* pointer;
size_t length;
} array;
typedef struct vector_struct {
unsigned char* pointer;
// Reserved is the amount of allocated memory not being used.
// MemoryLength = length + reserved;
size_t length, reserved;
} vector;
// Example Usage:
vector* vct = (vector*) calloc(sizeof(vector), 1);
vct->reserved = 0;
vct->length = 24;
vct->pointer = (unsigned char*) calloc(arr->length, 1);
array* arr = (array*) vct;
printf("%i", arr->length);
free(arr->pointer);
free(arr);
C dường như cấp phát bộ nhớ cho các thành viên struct theo thứ tự chúng được xác định trong struct. Điều này có nghĩa là nếu bạn bỏ vector -> array
bạn sẽ vẫn nhận được kết quả tương tự nếu bạn thực hiện các thao tác trên array
như bạn đã làm nếu bạn đã thực hiện trên vector
vì chúng có cùng thành viên và thứ tự các thành viên.
Miễn là bạn chỉ giảm xuống từ vector -> array
như thể array
là loại chung cho vector
bạn không nên gặp phải bất kỳ sự cố nào.
Hành vi này không xác định và không phù hợp mặc dù cấu trúc tương tự của các loại?
Bạn đang giả định 'array' và' vector' có đệm cùng, mà tôi không nghĩ được đảm bảo. – Cornstalks
Tại sao họ không? Các padding không nên khác nhau nếu họ có cấu trúc tương tự. Bất kỳ phần đệm bổ sung nào sẽ ở cuối, bên ngoài cấu trúc, nơi nó không quan trọng. – FatalSleep
Tôi có thể thấy lý do tại sao điều này có thể là hành vi bất thường, nhưng không chắc chắn 100% nếu nó không xác định và có bất kỳ mối đe dọa thực sự nào. – FatalSleep