我正在编写一个c ++函数来计算C ++中C类型数组的大小
使用这两个不同的代码时,我注意到一种非常奇怪的行为:
代码1:
int sz = sizeof array / sizeof *array;
代码2:
int array_size(const int *pointer)
{ int count=0;
if(pointer)
while(*pointer) {
count++;
pointer++;
}
return count;
}
当我在数组上应用这两个方法时,它给了我非常奇怪的行为:
示例1:
int array[10] = {31,24,65,32,14,5};// defined to be size 10 but init with size 6
代码一会给我size = 10,但代码2会给我6号大小,当我打印出*指针所指向的元素时,它会给我正确的数组元素:
31 24 65 32 14 5
示例2
int array[] = {31,24,65,32,14,5}; // no declared size but init with 6
代码1将给出大小6,代码2将给出大小12,当我打印出代码2中*指针指向的元素时,它给了我:
31 24 65 32 14 5 -802013403 -150942493 1461458784 32767 -1918962231 32767
这真的不对,那么可能导致这种行为的问题是什么?那些数字是什么?
感谢您的回答
答案 0 :(得分:6)
此数组有10个元素,无论您如何初始化它:
int array[10] = {31,24,65,32,14,5};
但初始化将前6个元素设置为特定值,其余元素设置为0
。它相当于:
int array[10] = {31,24,65,32,14,5,0,0,0,0};
使用sizeof
的第一个计算使用数组的实际大小(其长度乘以int
的大小),而第二个计算元素直到找到0
。因此它不计算数组的长度,而是计算数组中第一个非零序列的长度。
请注意,如果数组具有值为0
的元素,则第二种方法仅“有效”。否则你会超出界限并调用未定义的行为。
答案 1 :(得分:2)
array_size
假设有一个0
刚刚超过数组的末尾。这个假设是没有道理的。
答案 2 :(得分:1)
代码2不对。你不能假设数组以0结尾