C ++数组大小

时间:2015-05-30 16:38:29

标签: c++ c arrays

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

这真的不对,那么可能导致这种行为的问题是什么?那些数字是什么?

感谢您的回答

3 个答案:

答案 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结尾