Mảng nhiều chiều
Mảng hai chiều built-in được lưu liên tục theo row-major trong cả C và C++.
Mảng nhiều chiều là gì?
Mảng hai chiều built-in được lưu liên tục theo row-major trong cả C và C++.
Duyệt matrix row-major và tính tổng từng hàng.
Điểm quan trọng
- Pointer chỉ được trỏ tới object còn sống, đúng type hoặc null.
- Mỗi vùng nhớ sở hữu chỉ được giải phóng đúng một lần.
- Thể hiện ownership và const rõ ràng trong API.
Code ví dụ bằng C và C++
main.c
#include <stdio.h>
int main(void) {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int row = 0; row < 2; ++row) {
int total = 0;
for (int column = 0; column < 3; ++column) total += matrix[row][column];
printf("row %d=%d\n", row, total);
}
return 0;
}
row 0=6
row 1=15
C++
main.cpp
#include <array>
#include <iostream>
int main() {
std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
for (std::size_t row = 0; row < matrix.size(); ++row) {
int total = 0;
for (int value : matrix[row]) total += value;
std::cout << "row " << row << '=' << total << '\n';
}
}
row 0=6
row 1=15
So sánh C và C++
Function C cần biết mọi dimension trừ dimension đầu; std::array giữ dimension trong type và có at để kiểm tra bounds.
C
Ownership và cleanup là quy ước do lập trình viên tự bảo đảm.
C++
Container và RAII gắn ownership cùng cleanup vào lifetime của object.
Bài tập mở rộng
Chạy cả hai phiên bản rồi thay đổi để quan sát khác biệt về bảo đảm của từng ngôn ngữ.
- Test null và trường hợp cấp phát thất bại.
- Chạy AddressSanitizer và UndefinedBehaviorSanitizer.
- Ghi rõ pointer nào sở hữu và pointer nào chỉ quan sát.