在C语言中打印数组时出现奇怪的行为?

15 浏览
0 Comments

在C语言中打印数组时出现奇怪的行为?

我正在尝试打印一个数组,但是我没有得到预期的输出,循环打印预定义数组后出现了奇怪的数字。\n代码如下:\n

#include     
int 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

0
0 Comments

在C语言中,当我们打印数组时,可能会遇到奇怪的行为。解决这个问题的方法是改变sizeof(intArray)为sizeof(intArray)/sizeof(int),这样可以得到数组元素的数量。为什么我们要定义sizeof(int)?它与sizeof(intArray)/sizeof(intArray)有什么不同?

原因是sizeof一个数组名会给出整个数组的大小(以字节为单位)。而sizeof(intArray)/sizeof(intArray)始终为1。你正在将整个数组的大小除以一个元素的大小,这样就得到了数组的元素数量。这个答案与其他答案的不同之处在于sizeof(int)是硬编码的。如果你将intArray的类型改为long,你需要确保更新这个条件。其他答案没有这个问题。

0
0 Comments

问题原因:使用sizeof获取数组的大小时,得到的是数组的字节大小,而不是元素个数。

解决方法:使用sizeof获取数组中一个元素的大小,然后将数组的字节大小除以元素大小,即可得到数组的元素个数。在循环中,使用得到的元素个数作为循环终止条件,遍历数组并打印出每个元素。

注意事项:这种方法只适用于数组类型,对于使用malloc分配的内存块则不适用。

0
0 Comments

问题出现的原因是在for循环中的终止条件错误,导致索引超出范围,即i超过了最大索引值10,因为数组长度只有11。循环的终止条件应该是小于数组的长度(=11),而不是小于数组的大小。

解决方法是将循环终止条件修改为sizeof(intArray) / sizeof(intArray[0]),即数组的总大小除以一个元素的大小,这样可以得到数组的长度。具体代码如下:

for(i=0; i < sizeof(intArray) / sizeof(intArray[0]); i++)

通过将数组的总大小除以一个元素的大小,可以计算出数组的长度。

这种方法只适用于数组没有(还没有)退化为指针的边缘情况。在更复杂的情况下,可能会有一个由一个结构体组成的数组,通过每个结构体的大小来获取数组中的结构体数量。

需要注意的是,这种方法只适用于静态数组标识符的情况,而不适用于通过malloc() / calloc()分配的数组。

,问题的原因是循环终止条件错误,导致索引超出范围。解决方法是将循环终止条件修改为数组的总大小除以一个元素的大小,从而得到数组的长度。

0