Tôi vừa đọc xong K & R, và đó là tất cả C mà tôi biết. Tất cả các biên dịch của tôi được thực hiện từ dòng lệnh của Windows bằng cách sử dụng MinGW, và tôi không có kiến thức về các phương pháp gỡ lỗi nâng cao (do đó "nhận xét gỡ lỗi ghetto" trong chương trình thứ 2 của tôi bên dưới).Hiểu phân bổ bộ nhớ, chương trình thử nghiệm bị lỗi
Tôi đang cố gắng thực hiện một vài chương trình thử nghiệm nhỏ để giúp tôi hiểu rõ hơn về cách phân bổ bộ nhớ hoạt động. Các chương trình cặp đôi đầu tiên này không sử dụng malloc hoặc miễn phí, tôi chỉ muốn xem bộ nhớ được cấp phát và phân bổ như thế nào cho các mảng tiêu chuẩn cục bộ cho một hàm. Ý tưởng là tôi xem quá trình chạy RAM của tôi đang sử dụng để xem nó có tương ứng với những gì tôi hiểu không. Đối với chương trình đầu tiên dưới đây, nó hoạt động như tôi mong đợi. Hàm alloc_one_meg()
phân bổ và khởi tạo 250.000 số nguyên 4 byte, nhưng MB đó được phân bổ ngay sau khi hàm trả về. Vì vậy, nếu tôi gọi hàm đó 1000000 lần liên tiếp, tôi sẽ không bao giờ thấy mức sử dụng RAM của mình vượt quá 1MB. Và nó hoạt động.
#include <stdio.h>
#include <stdlib.h>
void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
}
main()
{
int i;
for (i=0; i<1000000; i++) {
alloc_one_meg();
}
}
Đối với chương trình thứ hai này dưới đây, ý tưởng là để không cho phép các chức năng để thoát ra, để có 1.000 bản sao của cùng một chức năng chạy cùng một lúc, mà tôi thực hiện với đệ quy. Lý thuyết của tôi là chương trình sẽ tiêu thụ 1GB RAM trước khi nó được cấp phát tất cả sau khi đệ quy kết thúc. Tuy nhiên, nó không vượt qua vòng lặp thứ 2 thông qua đệ quy (xem bình luận gỡ lỗi ghetto của tôi). Chương trình bị treo với một thông báo khá không mang tính thông tin (cho tôi) (một cửa sổ pop-up nói ____. Exe đã gặp phải một vấn đề). Thông thường tôi luôn có thể đi đến đáy của những thứ với phương pháp gỡ lỗi ghetto của tôi ... nhưng nó không hoạt động ở đây. Tôi bối rối. Vấn đề với mã này là gì? Cảm ơn!
#include <stdio.h>
#include <stdlib.h>
int j=0;
void alloc_one_meg() {
int megabyte[250000];
int i;
for (i=0; i<250000; i++) {
megabyte[i] = rand();
}
j++;
printf("Loop %d\n", j); // ghetto debug
if (j<1000) {
alloc_one_meg();
}
}
main()
{
alloc_one_meg();
}
Câu hỏi tiếp theo được đăng here.
Và bây giờ bạn gặp sự cố tràn ngăn xếp, bạn có hiểu biết rõ hơn về bộ nhớ. Buồn cười mọi thứ diễn ra như thế nào. –
Yup, tôi mới lập trình, nhưng không phải là mới đối với ý tưởng thử nghiệm. Tôi là một kỹ sư và một người sử dụng phần mềm nặng, và tôi biết rất rõ rằng việc phá vỡ mọi thứ là cách tốt nhất để hiểu họ! :-) – The111