Trong C, tôi biết rằng tôi có thể tự động phân bổ một mảng hai chiều trên heap bằng mã sau:
int** someNumbers = malloc(arrayRows*sizeof(int*));
for (i = 0; i < arrayRows; i++) {
someNumbers[i] = malloc(arrayColumns*sizeof(int));
}
Rõ ràng, điều này thực sự tạo ra một mảng các con trỏ một chiều cho một loạt các số nguyên một chiều riêng biệt và "Hệ thống" có thể hiểu ý tôi muốn nói khi tôi yêu cầu:
someNumbers[4][2];
Nhưng khi tôi khai báo tĩnh một mảng 2D, như trong dòng sau ...:
int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS];
... một cấu trúc tương tự có được tạo trên ngăn xếp không, hay nó có dạng hoàn toàn khác không? (tức là nó là một mảng con trỏ 1D? Nếu không, nó là gì và làm thế nào để các tham chiếu đến nó được tìm ra?)
Ngoài ra, khi tôi nói, "Hệ thống", cái gì thực sự chịu trách nhiệm cho việc tìm ra điều đó? Hạt nhân? Hoặc trình biên dịch C sắp xếp nó trong khi biên dịch?
malloc()
không dẫn đến một mảng N chiều. . Nó dẫn đến các mảng của con trỏ [đến các mảng của con trỏ [...]] để tách các mảng một chiều hoàn toàn . Xem Phân bổ chính xác các mảng đa chiều để xem cách phân bổ mảng N chiều TRUE .