我试图用来getchar()
读取输入数字的所有数字并将它们存储在数组中。但是,每次我运行程序时,第二位数字都会出错。
这是我的代码:
int ch = 0;
int digits[0];
int i = 0;
while ((ch = getchar()) != '\n') {
digits[i] = ch - '0';
i++;
}
为了显示出什么问题,我插入了两个printf
:
while ((ch = getchar()) != '\n') {
printf("%d ", ch);
digits[i] = ch - '0';
printf("%d\n", ch);
i++;
}
例如,当我输入时1100
,我得到:
49 49
49 1
48 48
48 48
当我在单独的循环中打印数组时,输出为:
1 10 0 0
输入时66666
,我得到:
54 54
54 6
54 54
54 54
54 5
数组是:
6 10 6 6 6
每当第二个数字(只有第二个数字)发生相同的怪异现象时,我就尝试了一堆其他不同长度的数字。谁知道那是为什么?非常感谢!
每次我运行程序时,第二位数字都会出错。
这是因为您已将数组声明digit
为zero-size array
,并且编译器没有为数组分配任何内存。因此,写入数组中的任何位置实际上都会写入为其他目的分配的内存位置(例如为其他变量分配的),并且还将具有undefined behavior
。
因此,您得到的结果是由于这种UNDEFINED BEHAVIOR
情况,在您的情况下,使用索引with写入任何位置digit
实际上是写入分配给程序中其他变量的内存,而您获得的内存位置digit[1]
恰好是分配给变量的内存位置程序中ch
的类型char
。因此,写入内存位置digit[1]
将修改您的ch
变量。既然是undefined behavior
,您可能会Segmentation Fault
为您的程序得到一个。
要解决您的问题,请声明数组digit
足够大。
#define SIZE_DIGITS /* Sufficient Size required by your application */
int digit[SIZE_DIGITS];
但是,在Standard C和C ++中,这zero-size array
是不允许的,如果使用的是GCC,请使用-pedantic
option对其进行编译。它会给出警告,说:
zero.c:3:6: warning: ISO C forbids zero-size array 'a' [-pedantic]
对于C ++,它会给出类似的警告。
同样,零尺寸数组作为结构的最后一个元素(实际上是可变长度对象的标头)非常有用。GNU C中允许使用它们。zero-size array
最后一个元素的结构称为variable-length structure
。您可以在此处了解更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句