2013-05-07 33 views
9

Tôi đọc một bài viết (quên URL), cho biết argv[argc] là con trỏ NULL (chứa \0). Để kiểm tra xem liệu nó có đúng không, tôi đã viết mã này, vâng nó tồn tại. Những gì tôi không hiểu là, tại sao hệ điều hành bao gồm con trỏ NULL này tại argv[argc]. Nó có hữu ích cho cái gì khác không?Là argv [argc] bằng NULL Pointer

int 
main (int argc, char **argv){ 

    while (*argv) 
     printf ("%s\n", *argv++); 

    return 0; 
} 
+0

"* argv [0] sẽ là con trỏ đến ký tự ban đầu của NTMBS đại diện cho tên được sử dụng để gọi chương trình hoặc" ".Giá trị của argc sẽ không âm. Giá trị của argv [argc] sẽ là 0. * " – Maroun

Trả lời

9

C Chuẩn 5.1.2.2.1/2 dấu thứ hai nói một cách rõ ràng

argv [argc] sẽ là một con trỏ null.

C++ chuẩn 3.6.1/2 cũng nói một cách rõ ràng

Giá trị của argv [argc] sẽ 0.

+0

Vâng, nhưng động lực cho điều này là gì? – Thilo

+0

Tại sao bầu trời xanh? Đó là một mảng được kết thúc bằng null của các mảng bị kết thúc bằng null của 'char'. Tôi đoán tính nhất quán và tạo điều kiện cho mã như OP đã viết. – rubenvb

+0

Xem, bạn có thể làm điều đó. :-) Âm thanh như một câu trả lời hay cho tôi. – Thilo

5

Tiêu chuẩn (C99 5.1.2.2.1p2) nhiệm rằng:

Nếu chúng được khai báo, các tham số cho hàm chính sẽ tuân thủ các ràng buộc sau:

- Giá trị của argc sẽ không âm.

- argv [argc] phải là một con trỏ rỗng.

...

Lý do của việc này là để cung cấp một kiểm tra dư thừa cho sự kết thúc của danh sách đối số, trên cơ sở thực tế phổ biến (ref: Lý do cho ngôn ngữ lập trình ANSI C (1990), 2.1.2.2).

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