Bạn nhận được hành vi này, vì int array [ROW][COLUMN] = {1};
làm không có nghĩa là "đặt tất cả các mục vào một". Hãy để tôi cố gắng giải thích cách hoạt động của điều này từng bước.
Cách rõ ràng, quá rõ ràng để khởi tạo mảng của bạn sẽ như sau:
#define ROW 2
#define COLUMN 2
int array [ROW][COLUMN] =
{
{0, 0},
{0, 0}
};
Tuy nhiên, C cho phép bạn loại bỏ một số mục trong một mảng (hoặc struct / union). Ví dụ, bạn có thể viết:
int array [ROW][COLUMN] =
{
{1, 2}
};
Điều này có nghĩa là, khởi tạo các phần tử đầu tiên thành 1 và 2, và các phần tử còn lại "như thể chúng có thời lượng lưu trữ tĩnh". Có một quy tắc trong C nói rằng tất cả các đối tượng có thời lượng lưu trữ tĩnh, không được khởi tạo rõ ràng bởi lập trình viên, phải được đặt bằng 0.
Vì vậy, trong ví dụ trên, hàng đầu tiên được đặt thành 1,2 và hàng tiếp theo là 0,0 vì chúng tôi không cung cấp cho chúng bất kỳ giá trị rõ ràng nào.
Tiếp theo, có một quy tắc trong C cho phép kiểu dấu ngoặc nhọn. Ví dụ đầu tiên cũng có thể được viết như
int array [ROW][COLUMN] = {0, 0, 0, 0};
mặc dù tất nhiên đây là văn phong nghèo nàn, khó đọc và khó hiểu hơn. Nhưng quy tắc này rất tiện lợi, vì nó cho phép chúng tôi viết
int array [ROW][COLUMN] = {0};
có nghĩa là: "khởi tạo cột đầu tiên trong hàng đầu tiên thành 0 và tất cả các mục khác như thể chúng có thời lượng lưu trữ tĩnh, tức là đặt chúng thành 0."
do đó, nếu bạn cố gắng
int array [ROW][COLUMN] = {1};
nó có nghĩa là "khởi tạo cột đầu tiên trong hàng đầu tiên thành 1 và đặt tất cả các mục khác thành 0".