我正在尝试打印一个数组但是我没有得到所需的输出,在循环完成打印预定义数组后会出现奇怪的数字。
代码是:
#include <stdio.h>
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
答案 0 :(得分:12)
for
循环中的破坏条件是错误的!导致index-out-of bound problem i
的{{3}}超过10
的最大索引值,因为数组长度仅为11
。循环中断条件应该是&lt;数组长度(= 11 )但不&lt;数组的大小。
sizeof(intArray)
的值等于11 * sizeof(int)
(= 44 )。
要理解它: sizeof
Operator:
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
,它的长度超过了数组的长度,因此条件错误,并且在运行时代码中有Undefined behavior。要更正它,请替换:
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
答案 1 :(得分:4)
sizeof
为您提供数组的字节数,而不是元素。要获得元素的数量,除以一个元素的大小:
for(i = 0; i < (sizeof intArray / sizeof intArray[0]); i++)
{
printf("%d\n", intArray[i]);
}
值得注意的是,这仅适用于数组类型,当您使用malloc
分配内存块时,它不起作用。
答案 2 :(得分:3)
您需要将sizeof(intArray)
更改为
sizeof(intArray)/sizeof(int)
这将给出数组元素的数量。
答案 3 :(得分:2)
更新
for(i=0;i<sizeof(intArray);i++)
到
for(i=0;i<sizeof(intArray)/sizeof(intArray[0]);i++)
sizeof(intArray)
给出数组的总大小(以字节为单位),而不是数组中元素的数量。
答案 4 :(得分:2)
您已将intArray
声明为11 int
的数组。每个int
占用内存中的一定数量的字节(通常为四个)。所以整个intArray
的大小是11 * 4 = 44个字节。
当您说i < sizeof(intArray)
时,您就是在说i < 44
。但你的阵列只有11个元素,而不是44个!所以你的循环将继续超过数组边界。它将继续读取四字节块并将它们解释为整数,并打印出垃圾值。
这就是为什么所有的答案都说你需要让你的循环条件为
i < sizeof(intArray) / sizeof (intArray[0])
您需要将整个数组的大小除以单个元素的大小,以获得数组中元素的数量。既然你已经知道元素的数量,你可以保持简单,只需说
i < 11
但是对于您可能不知道数组大小的更一般情况,您需要使用其他建议的循环条件。