2015-11-10 21 views
5

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.

+1

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

+0

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

+0

@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

Trả lời

3

Tôi đã tìm ra.

Mặc dù không có bất kỳ cờ tối ưu hóa trên các trình biên dịch, thông tin gỡ lỗi chỉ là sai ..

Vì vậy, tôi in ra các giá trị với hai for vòng và nó được khởi tạo một cách chính xác, ngay cả khi debugger nói cách khác (lạ) .

Cảm ơn bạn đã gửi ý kiến ​​

-1

Mã của bạn nên khởi tạo không. Trong thực tế, bạn chỉ có thể làm int matrix[MAX][MAX] = {}; và nó sẽ được khởi tạo thành 0. Tuy nhiên, int matrix[MAX][MAX] = {{1}}; sẽ chỉ đặt ma trận [0] [0] thành 1 và mọi thứ khác thành 0.

Tôi nghi ngờ những gì bạn đang quan sát Code :: Blocks là trình gỡ lỗi (gdb?) Không hiển thị chính xác vị trí của nó trong mã - đó là hoặc một số tác dụng phụ khác từ trình tối ưu hóa. Để kiểm tra lý thuyết đó, hãy thêm vòng lặp sau ngay sau khi khởi tạo:

`` `int i, j;

for (i = 0; i < MAX; i++) 
    for (j = 0; j < MAX; j++) 
    printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]); 

`` `

và xem những gì nó in phù hợp với đầu ra của chương trình gỡ rối.

Tôi sẽ đoán rằng những gì có thể xảy ra là vì bạn không sử dụng ma trận, trình tối ưu hóa có thể đã quyết định không khởi chạy nó. Để xác minh, hãy tháo rời chính của bạn (disass main trong gdb và xem ma trận có thực sự được khởi tạo hay không.

+1

'ma trận int [MAX] [MAX] = {};' không được phép trong Chuẩn C –

+0

Tôi đã tìm thấy câu trả lời. Bạn không thể chỉ đặt '{}' mà không có số 0 trong đó, và một dấu ngoặc kép tốt hơn '{{0}}'. Ngoài ra mảng đã được khởi tạo chính xác, tôi đã tìm ra trình gỡ rối chỉ hiển thị các ô sai hoặc trình biên dịch đang thực hiện tối ưu hóa theo mui xe (không có tôi đặt cờ tối ưu) – Zorgatone

+0

Ngoài ra tôi đã sử dụng ma trận sau trong mã , Tôi chỉ không hiển thị phần còn lại của chương trình vì nó không liên quan, vì tôi đang tạm dừng trình gỡ lỗi ngay sau khi khai báo và khởi tạo – Zorgatone

Các vấn đề liên quan