2010-04-08 39 views
5

Nguyên mẫu của bộ nhớ là void *memset(void *s, int c, size_t n);. Vậy tại sao tham số thứ ba là loại size_t? memset chỉ là một ví dụ, tôi muốn nhiều lý do chung hơn. Cảm ơn trước.Tại sao các thông số chức năng của loại size_t?

+0

Xem thêm: http://stackoverflow.com/questions/502856/whats-the-difference-between-sizet-and-int-in-c –

Trả lời

5

size_t là loại trả về của toán tử sizeof và được sử dụng để mô tả kích thước bộ nhớ. Trong trường hợp của memset, nó chỉ định số byte (n) trong (các) khối bộ nhớ sẽ được đặt thành giá trị đã cho (c).

Kích thước theo bit của size_t thay đổi dựa trên không gian địa chỉ của nền tảng đích. Nó không phải luôn luôn tương quan với kích thước đăng ký. Ví dụ, trong kiến ​​trúc bộ nhớ phân đoạn, sizeof (size_t) có thể nhỏ hơn sizeof (void *). Thông thường, size_t sẽ là 4 byte trên máy 32 bit, 8 byte trên máy 64 bit, v.v.

+0

Bạn có thể giải thích thêm về lý do tại sao 'sizeof (size_t) có thể là nhỏ hơn sizeof (void *) '? Cảm ơn rất nhiều;) – Grissiom

+1

Trong bộ nhớ phân đoạn, kích thước của mỗi phân đoạn nhỏ hơn tổng kích thước bộ nhớ. Ví dụ: trong một 80286 bạn có thể xử lý 2^24 tổng số byte nhưng chỉ sử dụng 2^16 byte liền kề trong mỗi phân đoạn. Xem http://en.wikipedia.org/wiki/Memory_segmentation Bây giờ, tôi không có 80286 trình biên dịch C99 tiện dụng, nhưng tôi đoán rằng sizeof (size_t) == 2 và sizeof (void *) == 4. –

+0

Vì vậy, nó sẽ là gì khi tôi cố gắng để nhớ 2^20 byte trong 80286? Mặc dù nó quá lớn nhưng tôi nghĩ rằng nó có ý nghĩa bởi vì chúng tôi có thể giải quyết 2^24 byte. – Grissiom

2

size_t là loại được sử dụng để biểu thị kích thước của đối tượng. Trong các kích cỡ C của các kiểu số nguyên (int, long, v.v.) phụ thuộc vào việc triển khai thực hiện và bạn cần sử dụng đúng loại trên mỗi trình biên dịch implementp sao cho kích thước đủ lớn để lưu trữ tất cả các giá trị có thể.

Tiêu đề sẽ đi kèm với nền tảng SDK sẽ có typedef sẽ ánh xạ size_t vào loại số nguyên bên phải. Vì vậy, bạn viết memset() một lần và nó biên dịch ngay trên mọi triển khai.

1

size_t là loại phù hợp để biểu diễn lượng bộ nhớ mà đối tượng dữ liệu yêu cầu. Nó là một loại số nguyên không dấu (thường, typedef unsigned int size_t;).

Đọc liên kết this để biết thêm thông tin.

+0

Điều đó không đúng. Trên nhiều (nếu không nhất) nền tảng 64 bit 'unsigned int' là 32-bit, trong khi' size_t' là 64-bit. – slacker

+0

Vâng, bạn đã đúng! – yassin

-2

size_t được đảm bảo đủ lớn để giữ con trỏ trên tất cả các nền tảng.

+0

Xem câu trả lời của Thẩm phán Maygarden. – user9876

+0

Đẹp downmod, nhưng nếu bạn thực sự đọc và hiểu câu trả lời của Thẩm phán Maygarden, bạn sẽ thấy rằng chúng tôi đang nói chính xác điều tương tự. "Kích thước theo bit của size_t thay đổi dựa trên không gian địa chỉ của nền tảng đích" là đẳng cấu để "size_t được đảm bảo đủ lớn để giữ một con trỏ trên tất cả các nền tảng." Thẩm phán Maygarden cho rằng size_t có thể nhỏ hơn kích thước đăng ký trên một số nền tảng. Anh ta không nói nó có thể nhỏ hơn kích thước con trỏ, bởi vì nó không thể. – jemfinch

+0

Vì vậy, sự khác biệt giữa kích thước đăng ký và kích thước con trỏ là gì? – Grissiom

Các vấn đề liên quan