奇怪的值被初始化为数组

use*_*911 5 c

int letters[] = {['A'] = 4, ['B'] = 8, ['E'] = 3, ['I'] = 1, ['O'] = 0, ['S'] = 5};
Run Code Online (Sandbox Code Playgroud)

当我初始化上面的数组字母时,我的假设是在每个大写字母的索引处,该值将是数字,即if ['A'] = 4,然后在index处,'A'该值将为4,其余未初始化的值将默认为0 .

但是当我打印数组字母的所有值时,我得到这个输出:

00000000000000000000000000000000000000000000000000000000000000000480030001000000000514303876720941309621-1392458268143038767232767-197939865932767-1979398659327670010143038792832767

我不知道负数来自哪里.

maf*_*fso 9

'S'是你给出一个值的最高索引,因为你的编码显然是ASCII,你的数组的长度是83(= 0x53).索引较小(没有初始化程序)的所有内容都初始化为0.

当您打印数组时,您正在访问数组越界,这是未定义的行为.

您的程序可能输出的是阵列后恰好在堆栈上的值.但是,如上所述,无法保证会发生什么.

HTH

  • @amo,这是标准的未定义行为.任何事都可以发生.没有必要发生. (6认同)

Sea*_*ght 7

我的猜测是你编写的用于打印数组的代码是错误的.刚试过这个:

#include <stdio.h>

int main()
{
  int letters[] = {['A'] = 4, ['B'] = 8, ['E'] = 3, ['I'] = 1, ['O'] = 0, ['S'] = 5};
  int i;

  for (i = 0; i <= 'S'; i++) {
    printf("%d\n", letters[i]);
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,可以打印所有内容5.