sizeof运算符的问题

时间:2011-01-23 07:27:56

标签: c++ arrays 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;
}
//------------------------------------------------------------------------------------------

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

输出:

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

请解释一下,为什么会这样。 可以做些什么来解决这个问题。

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

getSize()内,你得到指针的大小,这是8个字节(因为你可能正在运行64位操作系统)。在main()中,你得到了数组的大小。

如果您想知道数组大小,请将sizeof(S)的结果作为getSize()的附加参数传递。

更多的替代方案是使用一些容器(如std::vector)或将函数转换为模板函数,正如Nawaz所提议的那样。

答案 2 :(得分:0)

你得到指向数组的指针的大小。如果你想要数组的大小,你必须将元素的数量乘以每个元素的大小。

答案 3 :(得分:0)

您必须将数组的大小传递给函数。

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

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

如果您考虑一下,这是多余的:D

答案 4 :(得分:0)

S是一个int *,一个指向整数的指针,它是一个内存地址,在你的机器上是整数的两倍。

如果你想要数组的大小(即元素的数量),你不能直接在纯C中得到它。但由于这是一个c ++问题,有一种方法:使用{{1} },它有一个vector方法。

实际上,这并不完全正确:在函数中声明size()(并且只有在编译时显式初始化它,就像在示例中那样 - 甚至{ {1}}不起作用),S运算符确实得到了正确的答案,这就是为什么c ++允许你这样做的原因:

new int[19]

然后您可以使用sizeof(请参阅these docs)。

Nawaz在其他地方的模板版本是另一个很好的建议,它迫使编译器携带有关c ++数组构造的完整信息(再次注意,这在编译时都是已知的,这就是你可以明确参数中的大小的原因。)

答案 5 :(得分:0)

为防止这种意外滥用sizeof,您可以定义一个仅适用于数组的函数:

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

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

这也在Boost中以更一般的形式存在(接受任何带有size方法的东西,例如std :: vector)。