Sadece yaklaşık K & R okumayı bitirdikten ediyorum ve bütün bildiğim C'dir çökmesini. Tüm derlemem, MinGW kullanarak Windows komut satırından yapılır ve gelişmiş hata ayıklama yöntemleri hakkında bilgim yoktur (bu nedenle aşağıdaki 2. programımda "getto hata ayıklama" yorumu). anlama bellek ayırma, test programı
Ben beni daha iyi nasıl bellek ayırma çalıştığını anlamak yardımcı olacak birkaç küçük test programları yapmaya çalışıyorum. Bu ilk çift programlar malloc ya da ücretsiz kullanmazlar, sadece belleğin bir fonksiyona yerel diziler için nasıl tahsis edildiğini ve ayrıldığını görmek istedim. Benim düşüncem, anladıklarımla örtüşüp örtüşmediğini görmek için RAM kullanım sürecimi izliyorum. Aşağıdaki bu ilk program için beklediğim gibi çalışır.alloc_one_meg()
işlevi 250.000 4 baytlık tamsayılar ayırır ve başlatır, ancak işlev döndükçe MB de ayrılır. Yani, bu fonksiyonu arka arkaya 1000000 kez çağırırsam, RAM kullanımımın 1MB'nin üzerinde olduğunu asla görmemeliyim. Ve çalışıyor. Aşağıda bu ikinci program için
#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();
}
}
, fikri ben özyineleme ile gerçekleştirilebilir ki aynı anda, aynı işlevi çalışan 1000 kopyası olması, fonksiyon çıkmasına izin verilmez oldu. Benim teorim, programın tamamlandıktan sonra programın ayrılmasından önce 1GB RAM harcayacaktı. Ancak, özyineleme yoluyla 2. döngüyü geçmez (getto hata ayıklama yorum bölümüne bakın). Program oldukça bilgilendirici olmayan (benim için) ileti ile çöküyor (bir Windows pop-up söyleyerek ____. Exe bir sorunla karşılaştı). Genelde getto hata ayıklama yöntemiyle her zaman her şeyin altını çizebilirim ... ama burada çalışmıyor. Şoktayım. Bu kodla ilgili sorun nedir? Teşekkürler!
#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();
}
Takip soru here yayınlanmıştır.
Ve şimdi bir yığın taşması kazasında var, daha iyi bir bellek anlaması var. Komik şeyler böyle nasıl çalışır. –
Yup, programlama konusunda yeniyim, ama test fikrine yeni değil. Ben bir mühendisim ve ağır bir yazılımcıyım, KULLANICI, ve çok iyi bildiğim şeyleri anlamanın en iyi yolu! :-) – The111