Các manpage nói về memset
:Cách bộ nhớ khởi tạo một mảng các số nguyên bằng -1?
#include <string.h> void *memset(void *s, int c, size_t n)
Chức năng
memset()
lấp đầy đầu tiênn
byte của vùng nhớ được trỏ đến bởis
với byte liên tụcc
.
Rõ ràng là memset
không thể được sử dụng để khởi int
mảng như hình dưới đây:
int a[10];
memset(a, 1, sizeof(a));
đó là vì int
được đại diện bởi 4 byte (nói) và người ta không thể có được những mong muốn giá trị cho các số nguyên trong mảng a
.
Nhưng tôi thường thấy các lập trình viên sử dụng memset
để đặt các thành phần mảng int
thành 0
hoặc -1
.
int a[10];
int b[10];
memset(a, 0, sizeof(a));
memset(b, -1, sizeof(b));
Theo hiểu biết của tôi, khởi tạo với số nguyên 0
là OK vì 0
thể được biểu diễn trong 1 byte (có thể tôi sai trong bối cảnh này). Nhưng làm cách nào để có thể khởi tạo b
với -1
(giá trị 4 byte)?
Người bỏ phiếu, quan tâm giải thích? Câu hỏi đó có liên quan đến trang web này hay cái gì khác không? – haccks
Bạn hơi sai về lý do khởi tạo với '0' là OK. Nó là OK bởi vì '0' phù hợp trong một' unsigned char' (vì vậy nó không bị cắt bớt khi được sử dụng làm đối số thứ hai cho 'memset') * và * vì mẫu bit trong bộ nhớ cho một' sizeof (int) '-byte số không giống với mẫu bit trong bộ nhớ cho các số không byte một byte 'sizeof (int)'. Cả hai điều đó đều đúng cho việc này. Trong thực tế, những điều đó là đúng cho hai con số chính xác trong số học bổ sung twos: '0' và' -1'. – zwol