C++

2013-06-25 20 views
5

Dinamik ayrılmış bellek içinde dinamik bellek ayırma C++ dinamik bellek ayırma ile ilgili bir soru sormak istiyorum. Anlayacağım problemin doğasının basit C++ teknikleri kullanarak çözülmesi kolay, ancak bu özel egzersiz için daha fazla C-benzeri bir yaklaşım kullanmam gerektiğini anlıyorum.C++

typedef struct A{ 
    B *b; 
    int a; 
} 

typedef struct B{ 
    C *c; 
    int x; 
} 

typedef struct C{ 
    int y; 
} 

Ve en bu ana varsayalım:

aşağıdaki
int main(){ 
    A test; 
    test.a = 1; 

    test.b = (B*)calloc(2,sizeof(B)); 

    test.b[0].c = (C*)calloc(2,sizeof(C)); 
    test.b[0].x = 2; 
    test.b[0].c[0].y = 3; 
    test.b[0].c[1].y = 4; 

    test.b[1].c = (C*)calloc(2,sizeof(C)); 
    test.b[1].x = 5; 
    test.b[1].c[0].y = 6; 
    test.b[1].c[1].y = 7; 
} 

Benim soru gibi: ne olur Aşağıdaki yapılar var

: beni örnek alalım? test.b[i].c için ayrılmış bellek blokları daha önce test.b için ayrılmış bellek blokları ile çakışacak bir olasılık var mı? Bu mümkün olursa, bunun olmasını nasıl engelleyebilirim? Mümkün değilse, tam olarak nasıl calloc() bellek ayırır? Sayısal bir örneği gerçekten takdir ediyorum.

+1

Ayrıca emin olmak için NULL olmayan calloc döndürülen işaretçileri de kontrol edebilirsiniz. Daha emniyetli. –

cevap

4

Test.b [i] .c için ayrılan bellek bloklarının daha önce test.b için ayrılmış bellek bloklarıyla çakışması olasılığı var mı?

sayılı

ben tekrarlanmasını önler nasıl gerçekleşmesi mümkün olursa?

Bu böyle olamaz, bu yüzden endişelenmeyin. Mümkün değilse

Eğer calloc() bellek ayırır tam olarak nasıl açıklayabilir?

Eğer calloc arasam, geri başarısız olursa istenen nesne sayısını veya NULL sığabileceği büyüklükte sıfır başlatıldı bellek bloğuna bir işaretçi verir. NULL'u geri almadığınız sürece, endişelenecek başka bir şeyiniz yok.

"Sayısal örnek" ile ne demek istediğinizden emin değilim.

+0

Hızlı cevap için teşekkür ederiz. Bu gerçekten omuzlarımdan biraz stres alıyor, yine de kodumda neyin yanlış olduğunu bulmak zorundayım. Calloc'un daha yüksek seviyede ne yaptığını biliyorum (işaretçi kısmı anlamında). Sayısal örnekle, bazı bellek blok ayırmalarını içeren bir örnek kastediyorum. İlk kez calloc kullandığımda, 0x0000 ile 0x0010 arasındaki bellek bloklarını ayırdığı gibi diyelim. Bu gerçekten de Calloc'un sahne arkasında nasıl çalıştığını anlamama yardımcı olur. Eğer bunu sağlayabilirseniz gerçekten takdir ediyorum. –

+1

Bu sisteme çok bağlı - eğer bir tane bakmak istiyorsanız, web üzerinde bir sürü açık kaynaklı C kütüphanesi uygulaması var. –

+0

Çok teşekkür ederim. –