2015-05-24 14 views
5

Trong one of the answers trong Tips for golfing in C, tôi thấy mã này (phiên bản ungolfed): (? Nhưng những người quan tâm trong sân đang)Tôi phải làm gì nếu tôi khai báo một mảng không có kích thước trong phạm vi toàn cục?

s[],t; 

main(c){ 
    for(scanf("%*d "); ~(c=getchar()); s[t++]=c) 
     putchar(s[t]); 
} 

Tôi nghĩ rằng chương trình trên biểu UB. Nhưng điều tôi không hiểu là phạm vi toàn cầu là s[]. Tôi biết rằng khi loại biến toàn cục không được chỉ định, biến mặc định là int. Tôi tạo ra một chương trình nhỏ mà đáng ngạc nhiên biên dịch:

#include <stdio.h> 

int s[]; 
int main(void) 
{ 
    printf("Hello!"); 
} 

dù nó phát ra một cảnh báo:

prog.c:23:5: warning: array 's' assumed to have one element [enabled by default] 
int s[]; 
    ^
  • s trong chương trình trên là gì? Có phải là một int* hoặc cái gì khác không?
  • Điều này có hữu ích ở bất kỳ đâu không?
+0

's' là một mảng' int' với số phần tử được xác định thực hiện? – alk

+0

@alk, Vì vậy, triển khai phân bổ một số kích thước cho 's'? –

+0

Có lẽ là '0' hoặc' 1'? – alk

Trả lời

1

What is s in the above program? Is it an int* or something else?

s là loại không đầy đủ. Đó là lý do tại sao bạn không thể sizeof nó. Như @BLUEPIXY gợi ý, nó được khởi tạo bằng không vì nó được khai báo trong phạm vi toàn cầu tạo nên một "định nghĩa dự kiến".

int i[];
the array i still has incomplete type, the implicit initializer causes it to have one element, which is set to zero on program startup.

Bây giờ,

Will this be useful anywhere?

Nó khá vô dụng nếu bạn chỉ sử dụng s[0] vì tại thời điểm đó bạn đi cho s; trực tiếp. Nhưng, nếu bạn cần một mảng với một kích thước nhất định và bạn không quan tâm đến UB, đó là "okay".

+0

Nhưng nó không phải là "* thành viên của cấu trúc *". – alk

+0

Ý bạn là gì, @alk? 's' là một kiểu không đầy đủ được cho là được sử dụng như một thành viên mảng linh hoạt. Sử dụng khác không có ý nghĩa. – edmz

+1

Tôi có nghĩa là 's' không phải là" * thành viên của một cấu trúc * "phụ lục được trích dẫn không áp dụng. Hơn nữa theo bản thảo C11 6.9.2/5 (như đã được đề cập bởi @BLUEPIXY): Vì 's' là kiểu không hoàn chỉnh ** và ** trong phạm vi toàn cục nên nó được khởi tạo bằng' ... = {0} '. Vì vậy, nó kết thúc bằng 'int [1]' với 's [0]' bằng với '0'. – alk

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