<p>应使用 std::fill 对二维数组统一赋值,因其类型安全、语义清晰;示例:std::fill(&arr0, &arr0 + 3 * 4, -1);避免 memset 等字节级操作及错误传参。</p>

不能用 int arr[3][4] = {-1}; —— 这只会让 arr[0][0] 是 -1,其余全是 0。
用 std::fill 最稳妥
这是运行时统一赋值的首选,语义清晰、类型安全、跨平台无坑。
-
std::fill操作的是对象层面,不是字节,传-1就真填-1 - 对二维数组,需把二维视为一维内存块:总元素数 = 行 × 列
- 示例:
int arr[3][4]; std::fill(&arr[0][0], &arr[0][0] + 3 * 4, -1);
- 如果用
std::vector<std::vector<int>>,直接std::vector<std::vector<int>> v(3, std::vector<int>(4, -1));
用 std::array 配合初始化列表(C++11 起)
适合编译期大小已知、追求栈上安全和范围检查的场景。
-
std::array是聚合类型,支持嵌套花括号初始化 - 必须显式写出每行,但可省略部分元素(未写的自动为 0);要全 -1,就得全写或配合
std::fill - 示例:
std::array<std::array<int, 4>, 3> arr = {{ {{-1, -1, -1, -1}}, {{-1, -1, -1, -1}}, {{-1, -1, -1, -1}} }}; - 更简洁的写法是先声明再 fill:
std::array<std::array<int, 4>, 3> arr; std::fill(arr.begin(), arr.end(), std::array<int, 4>{-1});(注意内层需构造)
别碰 memset(arr, -1, sizeof(arr))
它“看起来能用”,但本质是按字节填 0xFF,依赖 int 的补码表示和平台字长。
立即学习“C++免费学习笔记(深入)”;
- 在 4 字节
int平台,0xFFFFFFFF == -1,所以“碰巧”对;换到 2 字节或 8 字节平台就失效 - 若目标是
-123,memset完全无法实现 - 编译器可能优化掉它,或在调试/UBSan 下报错;现代 C++ 工程中应视为反模式
- 即使你确认当前平台 OK,团队协作或移植时极易引入隐性 bug
最易被忽略的一点:二维数组名不是指针,&arr[0][0] 才是首元素地址;用 std::fill 时若传错起始位置(比如传 arr 或 &arr),会导致越界或静默失败。


















