Giả sử khởi tạo sau:Giá trị của các yếu tố của một mảng nhân vật khởi tạo là một chuỗi rỗng
char mystr[4] = "";
Có đảm bảo tiêu chuẩn C99 rằng một mảng nhân vật khởi tạo một chuỗi rỗng sẽ khởi tạo tất cả các yếu tố trong mảng nhân vật để null byte? Ví dụ: tiêu chuẩn có đảm bảo rằng mystr[2] == '\0'
không?
Làm thế nào về những khởi tạo:
char myfoo[4] = { '\0' };
char mybar[4] = { 0 };
Trong khi tôi khá chắc chắn rằng thiết lập một cách rõ ràng các yếu tố đầu tiên của một mảng nhân vật sẽ đảm bảo việc khởi tạo ngầm của phần còn lại của các yếu tố để 0
, tôi nghi ngờ một chuỗi khởi tạo chữ kết quả trong một bản sao cho mảng - do đó có nghĩa là đơn\0
được sao chép vào mảng trong khi các phần tử còn lại không được khởi tạo.
Đó là một điểm tốt, tôi không bao giờ nghĩ đến việc làm điều đó để khởi tạo những thứ khác hơn mảng. Có bất kỳ bất lợi để làm điều này như trái ngược với, nói, 'memset (& xyz, 0, sizeof (xyz));' –
@Taylor Brandstetter: Về mặt lý thuyết, '= {0}' là khác nhau. Nó khởi tạo dữ liệu với các giá trị '0' phụ thuộc vào loại phù hợp. Ví dụ, nếu một số nền tảng sử dụng mẫu '0xFFFFFFFFF' để biểu diễn các con trỏ null, thì' = {0} 'sẽ thực sự tạo ra biểu diễn' 0xFFFFFFFFF' thích hợp. Mặt khác, 'memset' của bạn sẽ chỉ lấp đầy mọi thứ với mẫu bit không bằng 0. Ví dụ khác, nếu một số nền tảng sử dụng mẫu bit khác 0 để đại diện cho giá trị '0.0' nổi,' = {0} 'sẽ tạo ra biểu diễn đó đúng cách, trong khi' memset' của bạn sẽ lặp lại mọi thứ bằng số không. – AnT
Được cấp, trong các nền tảng thực hành sử dụng mẫu bit khác 0 để biểu thị giá trị bằng không là hiếm và/hoặc kỳ lạ. Trên nền tảng hàng ngày điển hình, 'memset' đạt được hiệu ứng tương tự như' = {0} 'và, rất có thể, tạo ra cùng một mã. – AnT