由于我想在函数中动态找到数组大小,我使用了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
请解释一下,为什么会这样。 可以做些什么来解决这个问题。
答案 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)。