#CCBCHBAHAI0000103. Bẫy sizeof khi array đi vào hàm
Bẫy sizeof khi array đi vào hàm
Bẫy sizeof khi array đi vào hàm
Nguồn: Phước Hưng OJ
Phiên bản: Phước Hưng OJ Extended
Đề bài
Xét một chương trình C có một array object thật sự được khai báo tại nơi gọi:
int a[N];
Trong bài này, là một hằng số nguyên dương của chương trình mô phỏng. Ta quan tâm đến biểu thức
sizeof(a) / sizeof(a[0])
ở hai ngữ cảnh:
- ngữ cảnh
0: biểu thức được đánh giá ngay trong block nơiavẫn là array object; khi đó số phần tử suy ra được chính xác là ; - ngữ cảnh
1: biểu thức được đặt trong hàm có parameterint a[]; trong parameter list, kiểu này được điều chỉnh thànhint *, nênsizeof(a)là kích thước pointer, không phải kích thước toàn mảng. Vì vậy biểu thức không thể dùng một cách portable để suy ra số phần tử của mảng gốc.
Với mỗi truy vấn ngữ cảnh, hãy cho biết kết quả suy được về độ dài mảng.
Input
Dòng đầu chứa . Dòng thứ hai chứa số nguyên , mỗi .
Output
Với mỗi truy vấn: nếu , in ; nếu , in UNKNOWN. Mỗi kết quả trên một dòng.
Subtask
Subtask 1 (20 điểm): .
Subtask 2 (30 điểm): , .
Subtask 3 (50 điểm): , .
Ví dụ
Input
8 4
0 1 0 1
Output
8
UNKNOWN
8
UNKNOWN
Giải thích
Ở nơi khai báo, a còn là array object 8 phần tử. Trong parameter int a[], nó đã được điều chỉnh thành pointer nên không thể suy độ dài gốc bằng sizeof.