Từ quan sát của tôi, bạn có thể không biết chính xác những gì bạn muốn và gây nhầm lẫn về cấu trúc và số học con trỏ. Vui lòng trải qua 2 khả năng sau.
1) Mảng hai chiều với mỗi phần tử có con trỏ đến test
. Trong trường hợp này, bộ nhớ của tất cả các con trỏ đến test
s đã được static được phân bổ. Nhưng, bộ nhớ của test
s thực sự chưa sẵn sàng. Trong trường hợp này, bạn phải điền vào test [i][j]
từng cái một.
Mỗi một trong số test
là rời rạc trong bộ nhớ và bạn có lợi thế là tạo hoặc tiêu diệt chúng một cách linh hoạt.
typedef struct {
int i;
} test;
test* t[20][20];
/* or instead of statically allocated the memory of all the pointers to tests
you can do the following to dynamically allocate the memory
test ***t;
t = (test***)malloc(sizeof(test *) * 20 * 20);
*/
for (int i=0; i < 20; i++){
for (int j=0; j < 20; j++){
t[i][j] = malloc(sizeof(test));
}
}
2) Mảng hai chiều với mỗi phần tử là test
. Trong trường hợp này, bộ nhớ của tất cả các test
s đã được phân bổ. Ngoài ra, bộ nhớ của test
s thực thực sự sẵn sàng để sử dụng mà không cần chuẩn bị thêm.
Tất cả các test
s liên tục trong bộ nhớ dưới dạng khối lớn và luôn ở đó. Điều này có nghĩa là bạn có thể lãng phí một đoạn bộ nhớ nếu bạn chỉ cần tất cả test
s ở thời gian cao điểm nhất định và hầu hết thời gian bạn chỉ sử dụng một vài trong số chúng.
typedef struct {
int i;
} test;
test t[20][20];
/* or instead of statically allocated the memory of all tests
you can do the following to dynamically allocate the memory
test **t;
t = (test**)malloc(sizeof(test) * 20 * 20);
*/
Cảm ơn bạn rất nhiều! – Mortezaipo