Khi trả lời nhận xét cho câu trả lời khác của tôi here, tôi đã tìm thấy những gì tôi nghĩ rằng có thể là một lỗ trong tiêu chuẩn C (c1x, tôi chưa kiểm tra các phiên bản trước đó và vâng, tôi biết nó là vô cùng khó mà tôi một mình trong số tất cả cư dân của hành tinh đã tìm thấy một lỗi trong tiêu chuẩn). Thông tin sau:Vấn đề tiềm ẩn với ký tự chuẩn malloc'ing C
- Mục 6.5.3.4 ("Toán tử sizeof") cho 2 tiểu bang
"The sizeof operator yields the size (in bytes) of its operand"
. - Para 3 trong số đó cho biết:
"When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1"
. - Mục 7.20.3.3 mô tả
void *malloc(size_t sz)
nhưng tất cả điều đó nói là"The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate"
. Nó làm cho không có đề cập đến ở tất cả các đơn vị được sử dụng cho các đối số. - Phụ lục E bắt đầu số 8 là tối thiểu giá trị cho
CHAR_BIT
để ký tự có thể dài hơn một byte.
Câu hỏi của tôi chỉ đơn giản là thế này:
Trong một môi trường mà một char là 16 bit rộng, sẽ malloc(10 * sizeof(char))
phân bổ 10 ký tự (20 byte) hoặc 10 byte? Điểm 1 ở trên dường như chỉ ra điểm cũ, điểm 2 cho biết điểm thứ hai.
Bất kỳ ai có nhiều C-standard-fu hơn tôi đều có câu trả lời cho điều này?
Thực ra, tôi nghĩ bạn có thể có nó ở đó. dựa trên câu trả lời của bạn, tôi tìm thấy 3.6 (trong "Điều khoản, định nghĩa và ký hiệu") nêu rõ "đơn vị lưu trữ dữ liệu byte địa chỉ đủ lớn để giữ bất kỳ thành viên nào của bộ ký tự cơ bản của môi trường thực thi ... CHÚ THÍCH 2 - A byte bao gồm một chuỗi liên tiếp các bit, số lượng được xác định thực hiện ". – paxdiablo
Chết tiệt, hãy suy nghĩ về vinh quang và giải thưởng mà tôi đã nhận được để tìm ra một vấn đề trong tiêu chuẩn. Ồ, quay trở lại công việc ban ngày :-) – paxdiablo
Một lần nữa, tôi thấy mình lặp lại câu thần chú "Tôi cần lấy một bản sao tiêu chuẩn". Tôi sẽ thêm báo giá tiêu chuẩn của bạn vào câu trả lời của tôi cho sự hoàn chỉnh. –