2012-06-27 26 views
9

Có lẽ tôi chỉ là quá đổ googling, nhưng tôi luôn luôn nghĩ mảng char nhận được chỉ null chấm dứt bởi một khởi tạo chữ (char x[]="asdf";) và có một chút ngạc nhiên khi tôi thấy rằng điều này có vẻ không phải là trường hợp.Có phải tất cả các mảng char tự động bị hủy không?

int main() 
{ 
    char x[2]; 
    printf("%d", x[2]); 
    return 0; 
} 

Output: 0

nên không phải là một mảng khai báo là size = 2 * char thực sự có được kích thước của 2 ký tự? Hay tôi đang làm gì sai ở đây? Tôi có nghĩa là nó không phải là không phổ biến để sử dụng một mảng char như là một mảng char đơn giản và không phải là một chuỗi, hay là nó?

Trả lời

20

Bạn đang truy cập một mảng chưa được khởi tạo bên ngoài giới hạn của nó. Đó là đôi hành vi không xác định, mọi thứ đều có thể xảy ra, thậm chí nhận được 0 làm đầu ra.

Trong câu trả lời cho câu hỏi thực sự của bạn: Chỉ xâu được null-chấm dứt, và điều đó có nghĩa là char x[]="asdf" là một mảng của 5 yếu tố.

+0

Tôi cũng đã nghĩ về điều đó, vì vậy tôi cố gắng tạo mảng với các kích thước khác nhau và mảng luôn được theo sau là 0. (số 0 được hiển thị trong mẫu của tôi không được theo sau bởi 0, mà là mảng có kích thước 3 * char tại cùng một vị trí là) – user1329846

+0

@ user1329846: Bất cứ thứ gì được lưu trữ trong bộ nhớ sau khi kết thúc mảng là tới trình biên dịch, bạn nhận được 0 nhưng cũng có thể nhận được bất kỳ số nào khác như tiêu chuẩn nói nếu bạn cố gắng đọc vị trí tất cả các phiên cược bị tắt. Hãy để tôi làm rõ điều này: ngay cả khi bạn may mắn luôn nhận được 0 ở đó, mã của bạn vẫn kích hoạt _undefined behavior_ và có thể không thành công bất cứ lúc nào. –

+0

Cảm ơn bạn đã không sử dụng bất cứ điều gì có thể xảy ra, ngay cả máy tính của bạn có thể tự đặt lửa. Không, nó không thể. Và tất cả những ví dụ tuyệt vời đó chỉ là ngu xuẩn. – jn1kk

3

char mảng là không phải tự động NULL chấm dứt, chỉ chuỗi ký tự, ví dụ: char *myArr = "string literal"; và một số con trỏ chuỗi ký tự được trả lại từ các phương thức chuỗi stdlib.

C không kiểm tra giới hạn. Vì vậy, một mảng được khai báo là kích thước 2*char cung cấp cho bạn 2 khe cắm bộ nhớ mà bạn có thể sử dụng, nhưng bạn có quyền tự do đi bộ trên bộ nhớ ở hai bên, đọc và ghi và do đó gọi hành vi không xác định. Bạn có thể thấy 0 byte tại đó. Bạn có thể viết thư cho array[-1] và làm hỏng chương trình của bạn. Bạn có trách nhiệm theo dõi kích thước mảng của mình và tránh chạm vào bộ nhớ mà bạn không phân bổ.

Thông thường sử dụng mảng char làm mảng char đơn giản, ví dụ: ngoài chuỗi C, để giữ bất kỳ bộ đệm byte tùy ý nào.

0

Nếu t là mảng có kích thước 2, thì trường hợp cuối cùng là t[2 - 1] = t[1] và không phải là 2. t[2] nằm ngoài giới hạn.

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