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ố.
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. –