c - 在 C 中过度填充数组
问题描述
如果我在 C 中(在 Windows 上)声明 2 个数组 arr1 和 arr2 并用整数 0 到 15 填充 arr1,则一些溢出会转到 arr2,但不是全部。为什么?
int arr1[10];
int arr2[10];
int arr3[10];
int i;
for (i = 0 ; i < 10 ; i++)
{
arr1[i] = 100 + i;
arr3[i] = 300 + i;
}
for (i = 0 ; i < 15 ; i++)
{
arr2[i] = 200 + i;
}
printf ("arr1: ");
for (i = 0 ; i < 10 ; i++)
printf ("%d, ", arr1[i]);
printf ("\n");
printf ("arr2: ");
for (i = 0 ; i < 10 ; i++)
printf ("%d, ", arr2[i]);
printf ("\n");
printf ("arr3: ");
for (i = 0 ; i < 10 ; i++)
printf ("%d, ", arr3[i]);
printf ("\n");
输出:
arr1: 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
arr2: 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
arr3: 212, 213, 214, 303, 304, 305, 306, 307, 308, 309,
预期的:
arr1: 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
arr2: 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
arr3: 210, 211, 212, 213, 214, 305, 306, 307, 308, 309,
解决方案
这里最有可能的是程序的其他部分设法在 arr2 之后直接在内存中分配了 8 个(或 16 个,取决于架构)字节,因此最终在这些字节之后分配了 arr3。因此,当您写入 210 和 211 时,它们实际上在将其余部分写入 arr3 之前覆盖了其他内存。
推荐阅读
- sql - 如何根据条件按组选择第一项?
- microsoft-graph-api - 应该使用哪些资源通过 Graph v1.0 API 创建对特定日历的订阅
- ios - 从深层链接启动应用程序时未调用 AppDelegate ContinueUserActivity,应归咎于 Firebase SDK
- r - R中的nlcom(Stata)等价物?回归系数的非线性变换
- python - 带有滚动条的 TextView - Python 3 Glade Gtk +3
- c# - 每年增加时如何增加 var?
- python - 如何使用 Grouper 进行分组,但我想在频率中使用最近的日期作为参考
- python - Django:按“event__pk”聚合
- c++ - Can't Get _UNICODE Undefined using Character Set Setting in VS 2017 C++
- kubernetes - 如何更新 statefulset 中的 storageClassName?