Nếu tôi viết:Khởi tạo char mảng với String nhỏ Literal
char arr[8] = "abc";
Có bất kỳ đặc điểm kỹ thuật hơn những gì arr[4]
có thể? Tôi đã làm một số xét nghiệm với Clang và có vẻ như các ký tự còn lại trong mảng được đặt thành rỗng. Ngoài ra, char arr[8] = "";
zeroes mỗi byte. Không chắc chắn nếu đây là một biên dịch thuận tiện, hành vi tiêu chuẩn, trùng hợp ngẫu nhiên hoặc tôi đã nhận nó sai.
void a()
{
char arr[8] = "abc"; /* breakpoint here, line 3 */
strcpy(arr, "1234567");
}
int main()
{
a();
a();
return 0;
}
Debugger bảng điểm:
Breakpoint 1, a() at str.c:3 3 char arr[8] = "abc"; (gdb) s Current language: auto; currently minimal 4 strcpy(arr, "1234567"); (gdb) p arr $1 = "abc\000\000\000\000" (gdb) c Continuing. Breakpoint 1, a() at str.c:3 3 char arr[8] = "abc"; (gdb) p arr $2 = "1234567" (gdb) s 4 strcpy(arr, "1234567"); (gdb) p arr $3 = "abc\000\000\000\000"
@Lundin - trên thực tế, arr [3] được thiết lập để null-chấm dứt, vì vậy ông ấy đúng để hỏi về arr [4] –
@JamesCaccese Có vẻ là một lỗi đánh máy ... anyway, tất cả đều được giải thích trong câu trả lời tôi đăng. – Lundin
@Lundin - ai là lỗi đánh máy, của bạn hay @ sidyll's? Nhận xét của bạn ở trên rằng arr [4] được đặt thành null-chấm dứt vì "" là sai. arr [3] được đặt thành null-termination vì "", arr [4] được đặt thành 0 vì nó không được khởi tạo một cách rõ ràng. Câu trả lời của bạn dưới đây là chính xác, nhưng nhận xét của bạn bị tắt bởi một và nó gây nhầm lẫn vấn đề. Vì bạn không thể chỉnh sửa nhận xét, có thể bạn nên xóa nhận xét đó. –