在C中打印数组时奇怪的行为?

我正在尝试打印一个数组但是我没有得到所需的输出,在循环完成打印预定义数组后出现了奇怪的数字。

代码是:

#include  int main(){ int intArray[11] = {1,2,8,12,-13,-15,20,99,32767,10,31}; int i=0; for(i=0;i<sizeof(intArray);i++){ printf("%d\n",intArray[i]); } } 

输出:

 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 

for循环中的破坏条件是错误的! 这导致索引超出绑定问题,因为i超过最大索引值10因为数组长度只有11 。 循环中断条件应该是<数组的长度(= 11 )但不是 <数组的大小。 sizeof(intArray)值等于11 * sizeof(int) (= 44 )。

要理解它,请阅读: sizeof运营商 :

6.5.3.4 sizeof运算符,1125:

sizeof运算符应用于数组类型时,结果是数组中的总字节数。

根据这一点,当sizeof应用于静态数组标识符的名称(未通过malloc() / calloc()分配)时,结果是整个数组的大小(以字节为单位)而不是地址。 这等于每个元素的大小乘以数组的长度。
换句话说: sizeof(intArray) = 11 * sizeof(int) (因为intArray长度为11)。 因此, 假设 sizeof(int)是4字节,则sizeof(intArray)等于44

下面的代码示例及其输出将帮助您进一步了解(阅读评论):

 int main(){ int intArray[11] = {1, 2, 8, 12, -13, -15, 20, 99, 32767, 10, 31}; int i = 0; printf("sizeof(intArray): %d\n", sizeof(intArray) //1. Total size of array ); printf("sizeof(intArray[0]): %d\n", sizeof(intArray[0]) //2. Size of one element ); printf("length: %d\n", sizeof(intArray) / sizeof(intArray[0]) //3. Divide Size ); return 0; } 

输出:

 sizeof(intArray): 44 //1. Total size of array: 11 * 4 = 44 sizeof(intArray[0]): 4 //2. Size of one element: 4 length: 11 //3. Divide Size: 44 / 4 = 11 

可以检查工作代码@ ideone ,注意:我假设int的大小是4

现在请注意, sizeof(intArray)44 ,它超过了数组的长度,因此条件错误,并且在运行时代码中有未定义的行为 。 要更正它,请更换:

 for(i=0; i < sizeof(intArray); i++) // ^--replace-----^ // wrong condition = 44 

附:

 for(i=0; i < sizeof(intArray) / sizeof(intArray[0]); i++) // ^------------------------------------^ // condition Corrected = 11 

为了计算数组的长度,我简单地将数组的总大小除以一个元素的大小,代码是:

 sizeof(intArray) / sizeof(intArray[0]) // 44 / 4 = 11 ^ ^ total size of size of first element array 

sizeof 以字节为单位给出数组的大小,而不是元素。 要获得元素的数量,除以一个元素的大小:

 for(i = 0; i < (sizeof intArray / sizeof intArray[0]); i++) { printf("%d\n", intArray[i]); } 

值得注意的是,这仅适用于数组类型,当您使用malloc分配了一块内存时,它不起作用。

您需要将sizeof(intArray)更改为

 sizeof(intArray)/sizeof(int) 

这将给出数组元素的数量。

更新

 for(i=0;i 

 for(i=0;i 

sizeof(intArray)给出数组的总大小(以字节为单位),而不是数组中元素的数量。

您已将intArray声明为11个int的数组。 每个int占用内存中的一定数量的字节(通常为四个)。 所以整个intArray的大小是11 * 4 = 44字节。

当你说i < sizeof(intArray) ,你就是说i < 44 。 但你的arrays只有11个元素,而不是44个! 所以你的循环将继续超过数组边界。 它将继续读取四字节块并将它们解释为整数,并打印出垃圾值。

这就是为什么所有的答案都说你需要有你的循环条件

 i < sizeof(intArray) / sizeof (intArray[0]) 

您需要将整个数组的大小除以单个元素的大小,以获得数组中元素的数量。 既然你已经知道元素的数量,你可以保持简单,只是说

 i < 11 

但是对于您可能不知道数组大小的更一般情况,您需要使用其他建议的循环条件。