2012-01-08 66 views

Trả lời

1

Bạn sẽ nhận được chẩn đoán.

int [x][] là loại mảng không hoàn chỉnh không thể hoàn thành.

3

Bạn sẽ nhận được lỗi biên dịch. Đối với mảng đa chiều, tối đa thứ nguyên đầu tiên có thể bị bỏ qua. Ví dụ: int array[][x] sẽ hợp lệ.

+1

Để biết thêm chi tiết về phân tích cú pháp typedef: http://publications.gbdirect.co.uk/c_book/chapter8/typedef.html –

8

Giả sử bạn có một nơi nào:

#define x 3 

Như những người khác chỉ ra, typedef int array [3][]; sẽ không biên dịch. Bạn chỉ có thể bỏ qua phần tử quan trọng nhất (tức là thứ nhất) của độ dài mảng.

Nhưng bạn thể nói:

typedef int array [][3]; 

Điều này có nghĩa rằng array là một mảng int (có độ dài như-chưa xác định) có độ dài 3 mảng.

Để sử dụng, bạn cần chỉ định độ dài. Bạn có thể làm điều này bằng cách sử dụng một initialiser như vậy:

array A = {{1,2,3,},{4,5,6}}; // A now has the dimensions [2][3] 

nhưng bạn không thể nói:

array A; 

Trong trường hợp này, kích thước đầu tiên A 's không được xác định, vì vậy trình biên dịch doesn 't biết bao nhiêu không gian để phân bổ cho nó.

Lưu ý rằng nó cũng tốt để sử dụng array loại này trong một định nghĩa chức năng - như mảng trong định nghĩa hàm luôn chuyển con trỏ đến phần tử đầu tiên của họ bởi trình biên dịch:

// these are all the same 
void foo(array A); 
void foo(int A[][3]); 
void foo(int (*A)[3]); // this is the one the compiler will see 

Lưu ý rằng trong trường hợp này:

void foo(int A[10][3]); 

Trình biên dịch vẫn thấy

void foo(int (*A)[3]); 

Vì vậy, phần 10 của A[10][3] bị bỏ qua.

Nói tóm lại:

typedef int array [3][]; // incomplete type, won't compile 
typedef int array [][3]; // int array (of as-yet unspecified length) 
         // of length 3 arrays