c++数组大小的奇怪行为

Strange behavior of C++ array size

本文关键字:数组 c++      更新时间:2023-10-16

我正在写一个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

代码1会给我size = 10,但代码2会给我size = 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 

是不正确的,那么是什么问题导致了这种行为呢?这些数字是什么?

谢谢你的回答

这个数组有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的元素时才"有效"。否则你会越界并调用未定义行为。

array_size假设在数组末尾有一个0

代码2不正确。不能假设数组以0

结尾