奇怪的值被初始化为数组

时间:2014-06-20 20:56:40

标签: c

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

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

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

  

00000000000000000000000000000000000000000000000000000000000000000480030001000000000514303876720941309621-1392458268143038767232767-197939865932767-1979398659327670010143038792832767

我不知道负数来自何处。

3 个答案:

答案 0 :(得分:9)

'S'是您为其提供值的最高索引,并且由于您的编码显然是ASCII,因此数组的长度为83(= 0x53)。索引较小(没有初始值设定项)的所有内容都初始化为0

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

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

HTH

答案 1 :(得分: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;
}

它工作正常并打印所有内容,包括5

答案 2 :(得分:2)

你很可能正在使用一个结构如下的for循环:

for ( int i = 0; i < sizeof letters; i++ ) {
    // ...
}

问题出在sizeof letters部分,它给你的是...... letters的大小,而不是数组有多少元素。相反,letters的大小,即单个元素的大小乘以元素的数量:

sizeof letters == sizeof * letters * amountofelements;
// evaluates to 1
// assuming that amountofelements is the amount of elements that
// the array letters points to

// more: sizeof * letters is equivalent to sizeof( letters[0] )
// and the equation above is equivalent to
// sizeof( letters ) == sizeof( letters[0] ) * amountofelements;
// just in case...

因此,请将for条件更改为以下内容:

for ( int i = 0; i < sizeof letters / sizeof * letters; i++ ) {
    // whatever
}

感谢您给我机会使用我的心灵力量,凯克。