我正在写一个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的元素时“起作用”。否则,您将超出范围并调用未定义的行为。

07-26 09:34
查看更多