在C语言中打印数组时出现奇怪的行为?
在C语言中打印数组时出现奇怪的行为?
我正在尝试打印一个数组,但是我没有得到预期的输出,循环打印预定义数组后出现了奇怪的数字。\n代码如下:\n
#includeint main(){ int intArray[11] = {1,2,8,12,-13,-15,20,99,32767,10,31}; int i=0; for(i=0;i \n输出:\n
1 2 8 12 -13 -15 20 99 32767 10 31 11 1629976468 2674040 2665720 1627423265 1 2665616 -2147417856 1629976534 1629976468 2674040 0 1627423172 1629976532 0 1629110043 0 0 0 0 0 0 0 0 0 0 0 1629976538 0 1629956432 2674276 0 1627407935
在C语言中,当我们打印数组时,可能会遇到奇怪的行为。解决这个问题的方法是改变sizeof(intArray)为sizeof(intArray)/sizeof(int),这样可以得到数组元素的数量。为什么我们要定义sizeof(int)?它与sizeof(intArray)/sizeof(intArray)有什么不同?
原因是sizeof一个数组名会给出整个数组的大小(以字节为单位)。而sizeof(intArray)/sizeof(intArray)始终为1。你正在将整个数组的大小除以一个元素的大小,这样就得到了数组的元素数量。这个答案与其他答案的不同之处在于sizeof(int)是硬编码的。如果你将intArray的类型改为long,你需要确保更新这个条件。其他答案没有这个问题。
问题出现的原因是在for循环中的终止条件错误,导致索引超出范围,即i超过了最大索引值10,因为数组长度只有11。循环的终止条件应该是小于数组的长度(=11),而不是小于数组的大小。
解决方法是将循环终止条件修改为sizeof(intArray) / sizeof(intArray[0]),即数组的总大小除以一个元素的大小,这样可以得到数组的长度。具体代码如下:
for(i=0; i < sizeof(intArray) / sizeof(intArray[0]); i++)
通过将数组的总大小除以一个元素的大小,可以计算出数组的长度。
这种方法只适用于数组没有(还没有)退化为指针的边缘情况。在更复杂的情况下,可能会有一个由一个结构体组成的数组,通过每个结构体的大小来获取数组中的结构体数量。
需要注意的是,这种方法只适用于静态数组标识符的情况,而不适用于通过malloc() / calloc()分配的数组。
,问题的原因是循环终止条件错误,导致索引超出范围。解决方法是将循环终止条件修改为数组的总大小除以一个元素的大小,从而得到数组的长度。