Hôm nay tôi đã giúp một người bạn của tôi với một số mã C, và tôi đã tìm thấy một số hành vi kỳ lạ mà tôi không thể giải thích tại sao nó xảy ra. Chúng tôi đã có tệp TSV với một danh sách các số nguyên, với một int mỗi dòng. Dòng đầu tiên là số dòng mà danh sách có.Sự khác biệt giữa loại mảng và mảng được phân bổ với malloc
Chúng tôi cũng có tệp c với "readfile" rất đơn giản. Dòng đầu tiên được đọc thành n, số dòng, sau đó có một khởi tạo là:
int list[n]
và cuối cùng là vòng lặp for với fscanf.
Đối với các n nhỏ (đến ~ 100.000), mọi thứ đều ổn. Tuy nhiên, chúng tôi thấy rằng khi n lớn (10^6), một sự phân đoạn sẽ xảy ra.
Cuối cùng, chúng tôi đã thay đổi khởi tạo danh sách công việc
int *list = malloc(n*sizeof(int))
và tất cả mọi thứ khi tốt, ngay cả với n rất lớn.
Ai đó có thể giải thích tại sao điều này xảy ra? những gì đã gây ra segfault với int danh sách [n], đã được dừng lại khi chúng tôi bắt đầu sử dụng list = malloc (n * sizeof (int))?
Câu trả lời rất rõ ràng ... cảm ơn bạn! –
Câu trả lời hay! Tôi đã tự hỏi nếu đó cũng là một sự khác biệt về tốc độ? –
Do ảnh hưởng của địa phương tham chiếu, tôi nghi ngờ mảng được phân bổ theo stack sẽ nhanh hơn để truy cập và bản thân 'malloc' chậm hơn nhiều so với việc chỉ chạm vào con trỏ ngăn xếp. Nhưng thực sự, tốt nhất là sử dụng bất kỳ phương pháp nào phù hợp hơn cho nhiệm vụ trong tầm tay. – templatetypedef