Khi tôi cố chạy đoạn mã sau:
#include
khoảng trống chính()
{
char *a[10] = {"xin chào", "xin chào", "thế nào"};
int i = 0, j = 0;
a[0] = "này";
vì (i = 0;i < 10; i++)
printf("%s", a[i]);
}
Nó mang lại cho tôi đầu ra:
xin chào, thế nào(null)(null)(null)(null)(null)(null)(null)
Và khi tôi chèn '\n' vào câu lệnh printf:
#include
khoảng trống chính()
{
char *a[10] = {"xin chào", "xin chào", "thế nào"};
int i = 0, j = 0;
a[0] = "này";
vì (i = 0;i < 10; i++)
printf("%s\n", a[i]);
}
Nó mang lại cho tôi kết quả đầu ra sau:
Chào
hello
how
Lỗi phân đoạn
Tôi đã thử đọc trực tuyến và phát hiện ra rằng điều này là do trình xác định định dạng và trình biên dịch tự động chuyển đổi printf 转换为 puts Và puts không biết "%s\n", nhưng tôi vẫn không thể hiểu được. Bất cứ ai có thể giải thích nó bằng thuật ngữ đơn giản.
hiện hữu in()
Trung Vệ %s
Đó là hành vi không xác định đối với trình xác định định dạng để truyền con trỏ null. Trong một trường hợp, thời gian chạy đã cố gắng hoạt động tốt và hiển thị "(null)" cho trường hợp này. Trong trường hợp khác, hành vi không xác định là sự cố.
Một lý do có thể cho sự khác biệt này là các chuỗi công cụ biên dịch đôi khi chuyển đổi printf("%s\n", xxx)
được chuyển đổi tương đương đặt(xxx)
(GCC chắc chắn thực hiện điều này trong nhiều trường hợp). tôi đoán đặt()
Không thân thiện lắm với con trỏ null của bạn.
Cá nhân tôi thích "%S"
Hiển thị con trỏ null là "(null)" - sẽ thuận tiện hơn khi thêm một số ghi nhật ký gỡ lỗi nhanh. Tuy nhiên, nếu làm như vậy, bạn sẽ không thể nhắc khi chương trình gặp sự cố, vì vậy bạn không nên dựa vào nó để làm bất cứ việc gì khác.
Về c - printf ("%s\n",str); đưa ra một segfault nhưng printf ("%s",str); thì không, trong đó "str" là một con trỏ chuỗi, chúng tôi đã tìm thấy một con trỏ tương tự trên Stack Câu hỏi tràn: https://stackoverflow.com/questions/33268545/
Tôi là một lập trình viên xuất sắc, rất giỏi!