for
循环中的中断条件错误!这会导致索引越界问题i
超过最大索引值,这是因为10
数组长度只是11
. 循环中断条件应该是 < 数组长度( = 11),但不是< 数组大小。的值sizeof(intArray)
等于11 * sizeof(int)
(= 44 )。
要理解它,请阅读:运算符: sizeof
6.5.3.4 sizeof 运算符,1125:
当您将sizeof
运算符应用于数组类型时,结果是数组中的总字节数。
根据这个 whensizeof
应用于静态数组标识符的名称(不是通过malloc()
/分配calloc()
的),结果是整个数组的大小(以字节为单位),而不仅仅是地址。这等于每个元素的大小乘以数组的长度。
换句话说:sizeof(intArray)
= 11 * sizeof(int)
( 因为intArray
长度是 11 )。所以假设if sizeof(int)
is 4-bytes thensizeof(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