2011-09-15 29 views
9

Trong Visual Studio 2010, khởi tạo này hoạt động như mong đợi:Tại sao tôi không thể bỏ qua các kích thước hoàn toàn khi khởi tạo một mảng đa chiều?

char table[2][2] = { 
         {'a', 'b'}, 
         {'c', 'd'} 
        }; 

Nhưng nó dường như không hợp pháp để viết một cái gì đó như:

char table[][] = { 
        {'a', 'b'}, 
        {'c', 'd'} 
       }; 

Visual Studio phàn nàn rằng mảng này có thể không chứa các thành phần của ' rằng 'loại và sau khi biên dịch, VS báo cáo hai lỗi: chỉ mục bị thiếu và quá nhiều lần khởi tạo.

CÂU HỎI: Tại sao tôi không thể bỏ qua hoàn toàn các kích thước khi khởi tạo mảng đa chiều?

Trả lời

12

Chỉ có thể bỏ qua thứ nguyên bên trong nhất. Kích thước của các phần tử trong một mảng được suy ra cho kiểu được gán cho biến mảng. Do đó, loại yếu tố phải có kích thước đã biết.

  • char a[]; có yếu tố (ví dụ a[0]) kích thước 1 (8 bit), và có kích cỡ không rõ.
  • char a[6]; có yếu tố kích thước 1, và có kích thước 6.
  • char a[][6]; có yếu tố (ví dụ a[0], mà là một mảng) kích thước 6, và có kích cỡ không rõ.
  • char a[10][6]; có yếu tố kích thước 6. và có kích thước 60.

Không được phép:

  • char a[10][]; sẽ có 10 yếu tố không rõ kích thước.
  • char a[][]; sẽ có một số yếu tố không xác định có kích thước không xác định.

Kích thước của các phần tử là bắt buộc, trình biên dịch cần nó để truy cập các phần tử (thông qua số học con trỏ).

+6

Nói cách khác, trong khi kích thước của mảng chính nó có thể chưa biết, kích thước của các phần tử có thể không được biết? –

+0

@Miroslav: Chính xác! –

+0

Ah, vâng, cảm ơn vì thông tin này. Sau khi nghĩ thêm, nó chỉ có vẻ hợp lý, như mọi khi, phải không? ;-) –

0

Đây có phải là công việc có thể chấp nhận được không?

char * table [] = { "ab", "cd" }; 

EDIT: Lưu ý rằng nó sẽ thêm thêm '\ 0' vào cuối mỗi chuỗi.

+0

Đó là một giải pháp tốt đẹp. Nhưng không phải câu trả lời tôi đang tìm kiếm. Tuy nhiên, cảm ơn bạn đã cho tôi một mẹo hay. :-) –

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