我正在写一个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
代码一给我的大小为10,代码2给我的大小为6,当我打印出* pointer指向的元素时,它将给我正确的数组元素:
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中* pointer指向的元素时,它给我:
31 24 65 32 14 5 -802013403 -150942493 1461458784 32767 -1918962231 32767
这真的是不对的,那么导致这种现象的原因可能是什么?这些数字是多少?
感谢您的回答
最佳答案
无论您如何初始化,此数组都有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
的元素时“起作用”。否则,您将超出范围并调用未定义的行为。