2

我写了一个函数:

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

4 回答 4

2

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

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

所以

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

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

string par(int a[], int size)
于 2013-05-02T17:58:19.143 回答
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。)

于 2013-05-02T18:00:56.233 回答
1

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

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

于 2013-05-02T17:58:56.413 回答
1

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

于 2013-05-02T18:00:04.387 回答