2013-06-25 40 views
5

Tôi muốn đặt câu hỏi liên quan đến cấp phát bộ nhớ động trong C++. Tôi hiểu rằng bản chất của vấn đề tôi sắp đề xuất rất dễ giải quyết bằng cách sử dụng các kỹ thuật C++ đơn giản, nhưng đối với bài tập đặc biệt này, tôi phải sử dụng một cách tiếp cận giống C hơn. Hãy để tôi thiết lập một ví dụ:Phân bổ bộ nhớ động trong bộ nhớ được cấp phát động trên C++

Tôi có cấu trúc như sau:

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

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

typedef struct C{ 
    int y; 
} 

Và chúng ta hãy giả định này chính:

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; 
} 

Vì vậy, câu hỏi của tôi là như sau: gì sẽ xảy ra? Có khả năng các khối bộ nhớ được phân bổ cho test.b[i].c để chồng lấp với các khối bộ nhớ đã được phân bổ trước đó cho test.b không? Nếu điều đó có thể xảy ra, làm thế nào tôi có thể ngăn nó xảy ra? Nếu không thể, bạn có thể giải thích chính xác cách thức calloc() cấp phát bộ nhớ? Tôi thực sự sẽ đánh giá cao một ví dụ số.

+1

Bạn cũng có thể kiểm tra các con trỏ được trả về từ calloc không phải là NULL để đảm bảo. Nó an toàn hơn. –

Trả lời

4

Có khả năng các khối bộ nhớ được phân bổ cho thử nghiệm.b [i] .c để chồng chéo với các khối bộ nhớ đã được phân bổ trước đó cho test.b?

số

Nếu điều đó là có thể xảy ra như thế nào tôi có thể ngăn chặn nó xảy ra?

Nó không thể xảy ra, do đó, đừng lo lắng.

Nếu không thể, bạn có thể giải thích chính xác cách calloc() cấp phát bộ nhớ?

Mỗi lần bạn gọi calloc, nó mang lại cho bạn trở lại một con trỏ đến một khối bộ nhớ zero-khởi tạo đủ lớn để giữ số yêu cầu của các đối tượng, hoặc NULL nếu nó không thành công. Miễn là bạn không nhận được NULL trở lại, bạn không có gì khác để lo lắng về.

Tôi không chắc chắn ý của bạn là "ví dụ số".

+0

Cảm ơn bạn đã trả lời nhanh. Nó thực sự có một số căng thẳng ra khỏi vai của tôi, nhưng tôi vẫn phải tìm những gì là sai với mã của tôi. Tôi biết những gì calloc làm trên một cấp độ cao hơn (có nghĩa là một phần con trỏ). Bằng ví dụ số, tôi có nghĩa là một ví dụ liên quan đến phân bổ khối bộ nhớ nhất định. Hãy nói rằng khi tôi sử dụng calloc cho lần đầu tiên nó phân bổ khối bộ nhớ 0x0000 đến 0x0010 vv Nó sẽ thực sự giúp tôi hiểu cách calloc hoạt động đằng sau hậu trường. Nếu bạn có thể cung cấp điều đó nữa tôi sẽ thực sự đánh giá cao nó. –

+1

Điều đó phụ thuộc rất nhiều vào hệ thống - có rất nhiều triển khai thư viện C nguồn mở trên web nếu bạn muốn xem một. –

+0

Cảm ơn bạn rất nhiều. –

Các vấn đề liên quan