为什么sizeof(A),对于某些数组A,不能在函数内部工作?

时间:2015-02-21 20:43:16

标签: c++

以下

#include <iostream>

void printArraySize ( int * arr ) 
{
    std::cout << sizeof(arr)/sizeof(int);

}

int main () 
{
    int arr [] = {1, 2, 3, 69203};
    printArraySize(arr);  
    return 0;
}

输出1(证明:http://codepad.org/yKG3mZIz)。解释这个废话。一旦进入函数,数组是否会忘记它的大小?根据我的理解,传递arr,一个记忆地址,一个数字,只是意味着复制该数字。所以sizeof(arr)/sizeof(int)应该在函数内外表示相同的东西。

2 个答案:

答案 0 :(得分:1)

main中,arr是一个数组,sizeof会产生数组的大小。

printArraySize中,arr是指向int的指针,sizeof生成指向int对象的指针的大小。

在C中,您无法将(直接)数组传递给函数,您只能将指针传递给数组的第一个元素。要在printArraySize中获取数组的大小,您需要将其显式作为参数传递给函数。

在C ++中,您可以通过引用传递C数组,但您不应该首先使用C数组,而是使用std::arraystd::vector

答案 1 :(得分:0)

这是因为你检查sizeof ( int*)是sizeof指向int的指针。这是因为arr传递给了

中的函数
int arr [] = {1, 2, 3, 69203};
printArraySize(arr);

衰减到指向int的指针。它只是一个指向整数的指针,是数组的第一个元素。

C

为了做你想要实现的目标,经常使用一个宏(用于静态数组):

#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))

示例:

int arr [] = {1, 2, 3, 69203};
printf( "%d", ARRAY_SIZE(arr));

C ++

template<class T, size_t n>
size_t array_size( T(&)[n]) {
    return n;
}