2011-01-23 68 views
4

因为我想在函数中动态地查找数组的大小,所以我使用了sizeof运算符。但我得到了一些意想不到的结果 这里是一个演示程序,告诉你,我想要做什么。sizeof运算符的问题

//------------------------------------------------------------------------------------------ 
#include <iostream> 

void getSize(int *S1){ 

    int S_size = sizeof S1/sizeof(int); 
    std::cout<<"array size(in function):"<<S_size<<std::endl; 
} 

int main(){ 

    int S[]={1,2,3,2,5,6,25,1,6,21,121,36,1,31,1,31,1,661,6}; 
    getSize(S); 
    std::cout<<"array size:"<<sizeof S/sizeof(int)<<std::endl; 
    return 0; 
} 
//------------------------------------------------------------------------------------------ 

编译命令:克++ demo1.cc -o demo1的{的fedora 12}

输出:

array size(in function):2 
array size:19 

请解释,为什么发生这种情况。 可以做些什么来解决这个问题。

+1

阅读[本](http://stackoverflow.com/questions/1975128/sizeof-an-array-in-the-c-programming-language/1975133#1975133)回答和[this](http:// stackoverflow.com/questions/2384107/magic-arguments-in-function-templates)问题。 – 2011-01-23 07:32:21

+2

为什么数组不是指针的一个很好的例子。 – Oystein 2011-01-23 07:33:38

回答

9
void getSize(int *S1) 

当传递数组该功能,它衰减至指针类型,所以sizeof操作者将返回指针的大小。

然而,你定义的功能,

template<int N> 
void getSize(int (&S1)[N]) 
{ 
    //N is the size of array 
    int S_size1 = N; 
    int S_size2 = sizeof(S1)/sizeof(int); //would be equal to N!! 
    std::cout<<"array size(in function):"<<S_size1<<std::endl; 
    std::cout<<"array size(in function):"<<S_size2<<std::endl; 
} 

int S[]={1,2,3,2,5,6,25,1,6,21,121,36,1,31,1,31,1,661,6}; 
getSize(S); //same as before 

那么你可以有数组的大小,在功能!

查看演示自己的位置:指针http://www.ideone.com/iGXNU

+3

+1模板 – Marlon 2011-01-23 07:33:52

0

您正在获取指向该数组的指针的大小。如果你想要数组的大小,你必须乘以元素的数量乘以每个元素的大小。

3

里面getSize(),你要的大小,这是8个字节(因为你可能在运行64位操作系统)。在main()中,你会获得数组的大小。

如果您想知道数组大小,请将sizeof(S)的结果作为getSize()的附加参数传递。如纳瓦兹提出的,更多的替代方案将使用一些容器(如std::vector)或将函数转换为模板函数。

0

您将不得不将数组大小传递给函数。

由于您只传递指向数组中第一个元素的指针,因此函数没有关于其实际大小的信息。

void getSize(int *S1, size_t size) 
{ 
    int S_Size = sizeof(*S1) * size; 
} 

这是多余的,虽然,如果你仔细想想:d

0

Sint *,一个指向一个整数,这是一个内存地址,这是你的机器的两倍大小上整数。

如果你想要数组的大小(即元素的数量),你不能直接在纯C中获得。但是因为这是一个C++的问题,所以有一个办法:使用一个vector,它有一个size()方法。

其实,这并不完全正确:你声明S(且仅当它在编译时明确初始化为你在你的例子做 - 甚至new int[19]不工作)功能内,该sizeof运营商实际上没有得到正确的答案,这就是为什么C++允许你这样做:

int S[]={1,2,3,2,5,6,25,1,6,21,121,36,1,31,1,31,1,661,6}; 
vector<int> v(S, S + sizeof(S)/sizeof(int)); 

,然后你可以使用v.size()(见these docs)。

由纳瓦兹·模板版本在其他地方是强制编译成随身携带关于C++阵列的建设全面信息的另一个很好的建议(再次,注意,这是所有已知的在编译时,这就是为什么你可以明确地说明参数的大小)。

0

为了防止这种类型的sizeof意外误用的,你可以定义一个函数,它仅适用于数组:

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

如果你使用这个在你的代码,你就当应用于看到一个编译器错误S1,因为它不是一个数组。此外,它比sizeof array/sizeof array [0]更短且更明确(使用第一项的大小意味着您不必重复数组类型)。

这也已经存在于一个更一般的形式(接受任何大小的方法,如std :: vector)的Boost。