int letters[] = {['A'] = 4, ['B'] = 8, ['E'] = 3, ['I'] = 1, ['O'] = 0, ['S'] = 5};
当我初始化上面的数组字母时,我的假设是在每个大写字母的索引处,该值将是数字,即如果['A'] = 4
,那么在索引'A'
处,该值将为4其余未初始化的值默认为0。
但是当我打印出数组字母的所有值时,我得到了这个输出:
00000000000000000000000000000000000000000000000000000000000000000480030001000000000514303876720941309621-1392458268143038767232767-197939865932767-1979398659327670010143038792832767
我不知道负数来自何处。
答案 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
}
感谢您给我机会使用我的心灵力量,凯克。