Tôi đã cố gắng gỡ lỗi mã của mình trong một hàm khác khi tôi tình cờ gặp hành vi "lạ" này.Ma trận không được điền vào khai báo
#include <stdio.h>
#define MAX 20
int main(void) {
int matrix[MAX][MAX] = {{0}};
return 0;
}
Nếu tôi đặt một breakpoint trên dòng return 0;
và tôi nhìn vào các biến địa phương với Code :: Blocks ma trận không hoàn toàn đầy số không. Hàng đầu tiên là, nhưng phần còn lại của mảng chỉ chứa rác ngẫu nhiên.
Tôi biết tôi có thể thực hiện một vòng lặp for
đôi để khởi tạo mọi thứ theo cách thủ công về 0, nhưng không phải tiêu chuẩn C
phải điền ma trận này bằng không bằng bộ khởi tạo {{0}}
?
Có thể vì đã lâu rồi và tôi mệt, nhưng tôi có thể thề là tôi biết điều này.
Tôi đã cố gắng biên dịch với các tiêu chuẩn khác nhau (với Mã :: Khối được đóng gói gcc
trình biên dịch): -std=c89
, -std=c99
, std=c11
nhưng cũng vậy.
Bất kỳ ý tưởng nào về điều gì sai? Bạn có thể giải thích cho tôi không?
EDIT: Tôi đặc biệt hỏi về bộ khởi tạo {{0}}
.
Tôi luôn nghĩ rằng nó sẽ lấp đầy tất cả các cột và tất cả các hàng bằng 0.
CHỈNH SỬA 2: Tôi bị làm phiền cụ thể với Code::Blocks
và gói được đính kèm GCC
. Các nhận xét khác cho biết mã hoạt động trên các nền tảng khác nhau. Nhưng tại sao nó không làm việc cho tôi? :/
Cảm ơn.
cũng câu trả lời này cho biết bạn đang làm đúng http://stackoverflow.com/a/1688758/1339987 – djechlin
Sử dụng 2- Các mảng chiều là thứ mà mọi người thích làm ở trường, nhưng trong thực tế nó thường gây ra nhiều rắc rối hơn giá trị của nó Tại sao không chỉ sử dụng mảng đơn chiều, trong đó các phần tử MAX đầu tiên được giả định là hàng đầu tiên, các phần tử MAX tiếp theo là hàng thứ hai, vv dereference bởi ma trận [row * NCOLS + col]; Trong trường hợp đó, bạn có thể khởi tạo portably nó đơn giản như ma trận [NCOLS * NROWS] = {0}; – Dmitri
@Dmitri vì bạn phải giả định MAX yếu tố là hàng đầu tiên, làm toán học, sự tôn kính với nhiều toán học - Tôi tin rằng bạn trả lời câu hỏi của bạn: P – djechlin