int ar3[2][2]; // 未初始化,內容為隨機垃圾值
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
for (k = 0; k < c; k++)
ar3[i][j] += ar1[i][k] * ar2[k][j]; // += 在垃圾值上累加
C++ **局部數組不自動初始化**,`ar3` 佔用棧內存,內容為殘留隨機位模式。`+=` 直接在隨機值上累加,結果完全不可預期。
| 方法 | 代碼 | 適用場景 |
|---|---|---|
| 定義時零初始化 | `int ar3[2][2] = {};` 或 `int ar3[2][2] = {0};` | 最簡潔、C++11 保證全零、零開銷 |
| `memset` 清零 | `memset(ar3, 0, sizeof(ar3));` | C 風格、大數組、需兼容 C 編譯器 |
| `std::fill` / `std::array` | `std::fill(&ar3[0][0], &ar3[0][0]+4, 0);` 或用 `std::array |
現代 C++、泛型算法、類型安全 |
#include
#include
using Matrix2x2 = std::array, 2>;
Matrix2x2 multiply(const Matrix2x2& A, const Matrix2x2& B) {
Matrix2x2 C{}; // 聚合初始化為 0 (C++11)
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
for (int k = 0; k < 2; ++k)
C[i][j] += A[i][k] * B[k][j];
return C;
}
int main() {
Matrix2x2 ar1 = {{{2, 0}, {1, 0}}};
Matrix2x2 ar2 = {{{1, 2}, {0, 0}}};
Matrix2x2 ar3 = multiply(ar1, ar2);
for (const auto& row : ar3) {
for (int val : row) std::cout << val << '\t';
std::cout << '\n';
}
// 輸出:
// 2 4
// 1 2
}