将数组传递给函数没有给出正确的答案

时间:2013-05-02 17:54:48

标签: c arrays

我写了一个函数:

string par(int a[]){
int s=sizeof(a)/sizeof(*a);
cout<<s<<endl;
/*
    ..do something
*/

}

主要功能写为:

nt main(){
 int a[]={1,5,11,5};
 cout<<sizeof(a)/sizeof(*a)<<endl;
 cout<<par(a)<<endl;

}

我得到的输出是:

  

4

     

1

虽然我认为它应该与我传递相同的数组相同。请指出错误。谢谢..

4 个答案:

答案 0 :(得分:2)

在C ++中,当一个数组作为参数传递给一个函数时,实际上你正在传递一个指向数组的指针。

由于指针和int的大小是4或8(取决于ABI,因为你得到1然后我猜你有32位机器)你得到4/4即1。

所以

int s=sizeof(a)/sizeof(*a);为1。

您应该将大小作为参数传递,而不是尝试在函数内计算它:

string par(int a[], int size)

答案 1 :(得分:1)

你需要将数组的大小传递给函数,你不能从“x []”计算大小:

string par(int a[], int size){

答案 2 :(得分:1)

传递string par(int a[])实际上并没有传递数组,而是传递数组的地址,即string par(int *a)。因此该函数不知道已经传递了4个元素的数组。它知道已经传递了整数数组的指针。因此,该函数返回1作为数组大小。

答案 3 :(得分:1)

请参阅C FAQ中的问题6.46.21

问:当数组是函数的参数时,为什么sizeof不能正确报告数组的大小?我有一个测试程序

f(char a[10])
{
    int i = sizeof(a);
    printf("%d\n", i);
}

它打印4而不是10。

答:编译器假装数组参数被声明为指针(即,在示例中,作为char * a;请参阅问题6.4),sizeof报告指针的大小。另见问题1.24和7.28。

这是7.28所说的:

问:为什么sizeof没有告诉我指针所指向的内存块的大小?

答:sizeof告诉你指针的大小。没有可移植的方法来找出malloc'ed块的大小。 (还要记住,sizeof在编译时运行,另见问题7.27。)