首页 > 解决方案 > 在 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,

标签: c

解决方案


这里最有可能的是程序的其他部分设法在 arr2 之后直接在内存中分配了 8 个(或 16 个,取决于架构)字节,因此最终在这些字节之后分配了 arr3。因此,当您写入 210 和 211 时,它们实际上在将其余部分写入 arr3 之前覆盖了其他内存。


推荐阅读