2015-09-22 54 views
8

Tôi có một mảng gồm 3 phần tử. Nhưng tôi chỉ muốn khởi tạo 2 trong số đó. Tôi để trống phần tử thứ ba.Giá trị của các phần tử chưa được khởi tạo trong mảng ngôn ngữ C

unsigned char array[3] = {1,2,}; 
int main(){ 
    printf("%d",array[2]); 
    return 0; 
} 

Kết quả in là 0. Tôi đã thử nghiệm trên IAR và một số trình biên dịch trực tuyến.

Có quy tắc C nào cho giá trị của phần tử thứ ba không? Có trình biên dịch nào điền phần tử thứ ba bằng 0xFF không? (Đặc biệt là trình biên dịch chéo)

Trả lời

10

Có, tiêu chuẩn C xác định những gì xảy ra trong trường hợp này. Vì vậy, không, không nên có trình biên dịch tuân thủ tiêu chuẩn C mà intialises với 0xFF trong trường hợp này.

Mục 6.7.9 của tiêu chuẩn nói:

initialisation

...

10 ... Nếu một đối tượng có thời gian lưu trữ tĩnh hoặc chủ đề không phải là được khởi tạo rõ ràng, sau đó:

  • nếu có loại con trỏ , nó được khởi tạo thành một con trỏ null;
  • nếu nó có loại số học, nó là được khởi tạo thành (số dương hoặc không dấu);
  • nếu nó là tổng hợp, mỗi thành viên được khởi tạo (đệ quy) theo các quy tắc này, và bất kỳ phần đệm nào được khởi tạo thành 0 bit;
  • nếu đó là công đoàn, thành viên được đặt tên đầu tiên được khởi tạo (đệ quy) theo các quy tắc này và bất kỳ phần đệm nào được khởi tạo thành 0 bit;

...

21 Nếu có ít initializers trong một danh sách cú đúp kín hơn có là những yếu tố hoặc thành viên của một tổng hợp, hoặc các ký tự ít trong một chuỗi chữ sử dụng để khởi tạo một mảng của được biết đến kích thước hơn có là các phần tử trong mảng, phần còn lại của tổng hợp sẽ là được khởi tạo hoàn toàn giống với các đối tượng có thời gian lưu trữ tĩnh là .

0

Từ this bài đăng, có vẻ như cú pháp đó sẽ khởi tạo tất cả các phần tử sau dấu phẩy bằng 0. Hơn thế nữa; tất cả dữ liệu chưa được khởi tạo trong phân đoạn dữ liệu của chương trình (nói cách khác là tất cả các biến toàn cục chưa được khởi tạo) sẽ tự động được đặt thành 0, vì vậy nếu bạn đang tìm kiếm hành vi không xác định trong chương trình này, thì không có bất kỳ; nó sẽ luôn là 0.

0

Điều này có thể đạt được với phần mở rộng gcc như sau mảng char chưa ký [10] = {1,2, [2 ... 9] = 0xFF};

+2

Điều đó không thực sự trả lời câu hỏi. OP muốn biết nếu có một quy tắc cho những gì giá trị không xác định chỉ số được khởi tạo với (có) và sẽ bất kỳ trình biên dịch ngầm khởi tạo chúng đến 0xFF (không có trình biên dịch tuân thủ tiêu chuẩn sẽ làm như vậy). –

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