Trong trường hợp đầu tiên, "string"
có thể được lưu trữ trong khu vực chỉ đọc của quy trình, do đó, việc sửa đổi bộ nhớ được trỏ đến bởi p
sẽ gây ra hành vi không xác định.
Trong trường hợp thứ hai, bộ nhớ thực được cấp phát và khởi tạo trên ngăn xếp lúc chạy (hoặc trong phần thích hợp của quá trình khởi động chương trình nếu nó không phải là biến cục bộ), do đó sửa đổi bộ nhớ là OK.
Các trường hợp đầu tiên có thể được minh họa như thế này:
+---+ +---+---+---+---+---+---+---+
| | ----> | s | t | r | i | n | g | \0|
+---+ +---+---+---+---+---+---+---+
p
Trong khi trường hợp thứ hai là:
+---+---+---+---+---+---+---+
| s | t | r | i | n | g | \0|
+---+---+---+---+---+---+---+
p
Hai tờ khai có một sự khác biệt đáng kể, mặc dù bạn có thể đã nghe nói rằng họ là những giống với sách lập trình C chất lượng thấp.
Đầu tiên là một con trỏ loại char *
, trong khi thứ hai là một mảng loại char []
. Định danh mảng phân rã thành con trỏ trong một số ngữ cảnh, nhưng điều đó không làm cho chúng trỏ đến. Một con trỏ chỉ là một địa chỉ và một mảng là "toàn bộ điều" - trong trường hợp đầu tiên sizeof(p)
mang lại kích thước của một con trỏ (thường là 4
hoặc 8
tùy thuộc vào máy mục tiêu), và trong trường hợp thứ hai nó mang lại 7 * sizeof(char)
, độ dài của chuỗi thực tế.
Nguồn
2011-06-29 09:05:42
Bạn có thể muốn đọc phần 6 (và các mục khác) của [c-faq] (http://c-faq.com/). – pmg
tìm thấy điều thú vị: http://www.geeksforgeeks.org/storage-for-strings-in-c/ – NDestiny