Xét đoạn mã sau (nó xuất hiện như là kết quả của this discussion):tương đương của p [0] và * p với nhiều loại mảng không đầy đủ
#include <stdio.h>
void foo(int (*p)[]) { // Argument has incomplete array type
printf("%d\n", (*p)[1]);
printf("%d\n", p[0][1]); // Line 5
}
int main(void) {
int a[] = { 5, 6, 7 };
foo(&a); // Line 10
}
GCC 4.3.4 complains với thông báo lỗi:
prog.c: In function ‘foo’:
prog.c:5: error: invalid use of array with unspecified bounds
Thông báo lỗi tương tự trong GCC 4.1.2 và dường như là bất biến của -std=c99
, -Wall
, -Wextra
.
Vì vậy, nó không hài lòng với biểu thức p[0]
, nhưng nó hài lòng với *p
, mặc dù những điều này nên (theo lý thuyết) là tương đương. Nếu tôi nhận xét ra dòng 5, mã biên dịch và làm những gì tôi sẽ "mong đợi" (hiển thị 6
).
Có lẽ một trong những điều sau đây là đúng:
- sự hiểu biết của tôi về tiêu chuẩn C (s) là không chính xác, và các biểu thức không phải là tương đương.
- GCC có một lỗi.
Tôi muốn đặt tiền của tôi trên (1).
Câu hỏi: Mọi người có thể giải thích về hành vi này không?
Làm rõ: Tôi biết rằng điều này có thể được "giải quyết" bằng cách chỉ định kích thước mảng trong định nghĩa hàm. Đó không phải là những gì tôi quan tâm đến
Đối với điểm "tiền thưởng":. bất cứ ai có thể xác nhận rằng MSVC 2010 là do lỗi khi từ chối dòng 10 với thông điệp sau đây?
1><snip>\prog.c(10): warning C4048: different array subscripts : 'int (*)[]' and 'int (*)[3]'
Kể từ khi là (* p) [] dấu * mảng * loại biểu hiện, hoàn chỉnh hoặc bằng cách khác? –
@JohnBode: Vâng, nếu chúng ta có 'int (* p) [10] ', sau đó' (* p) 'sẽ là kiểu mảng. Cho rằng chúng tôi không có kích thước, tôi đoán rằng làm cho nó không đầy đủ. –