Đó là tối ưu hóa trình biên dịch. Bởi vì biến cục bộ sẽ không nằm trong phạm vi và một biến của cùng loại chính xác sắp được tạo, nó sẽ sử dụng lại địa chỉ bộ nhớ. Điều quan trọng cần lưu ý rằng đây vẫn là biến "mới" hoặc "mới" theo như chương trình của bạn có liên quan.
Hãy so sánh các đoạn mã sau và đầu ra:
for (i = 0; i < 3; i++) {
int n = 0;
printf("%p %d\n", (void *)&n, n++);
}
0x7fff56108568 0
0x7fff56108568 0
0x7fff56108568 0
for (i = 0; i < 3; i++) {
static int n = 0;
printf("%p %d\n", (void *)&n, n++);
}
0x6008f8 0
0x6008f8 1
0x6008f8 2
Nguồn
2011-02-27 22:31:48
Oh, được rồi, cảm ơn bạn. Tôi đã đơn giản hóa câu hỏi này, vì tôi thực sự đang cố gắng tạo một danh sách liên kết, và tôi tạo một nút mới trong vòng lặp, và tôi không muốn nút tiếp theo ghi đè nút từ lần lặp trước, nhưng đó là những gì nó đang làm. Tôi sẽ đăng câu hỏi mới, khi tôi có thể tạo đoạn mã có thể dễ dàng được phân tích. –
nếu bạn muốn cấu trúc dữ liệu liên tục, chúng phải được tạo trên 'heap' thay vì 'stack'. Sử dụng 'malloc' vv cho việc này. – Alnitak
@amandeepGrewal: Bạn nên tạo các biến trên heap (với malloc) để đạt được hành vi mong muốn –