【问题标题】:Understanding the information lost while passing array to a function without its size [duplicate]了解将数组传递给没有大小的函数时丢失的信息[重复]
【发布时间】:2012-01-06 16:27:11
【问题描述】:

可能重复:
finding size of int array

我很好奇为什么在这个简单的 C++ 代码中会出现以下行为。

在此我尝试在 2 个不同的地方计算浮点数组的大小:

#include <iostream>
#include <iomanip>

using namespace std; 

void foo(float a[])
{
 int size = sizeof(a) / sizeof(float) ;

 cout << size <<std::endl;   
}



int main(int argc, char *argv[])
{

  float a[] = {22.2, 44.4, 66.6} ;

  int size = sizeof(a) / sizeof(float) ;

  cout << size <<std::endl;   

  foo(a);

  return 0;
}

使用gcc 编译器我得到的输出为

~: ./a.out
3
2
~: 

对于其他数组大小,我得到第一个条目的大小是正确的,但第二个总是为 2,

现在在我的代码中,如果我使用数组并且我通常使用 std:: 向量,我永远不会传递没有大小的数组。但我很好奇这里发生了什么。

“a”在传递给函数时丢失了哪些信息?

计算的第二个 sizeof(a) 是多少?

【问题讨论】:

  • 在 MSVC 2010 上,我得到 3 和 1。很有趣。
  • @Joe:32 位和 64 位指针。 4byte(32bit 指针) / 4byte(float) == 1, 8byte(64bit 指针) / 4byte(float) == 2.
  • @xeo 我刚刚意识到数组衰减为一个指针,然后来找你的评论 :) 谢谢。

标签: c++ arrays


【解决方案1】:

第二个 sizeof() 正在计算:sizeof(float*) / sizeof(float)。函数foo 的参数只是一个指向数组第一个成员的指针,它与float* 类似(EDIT:相同)。所以 sizeof(array) 会给你指向第一个成员的指针的大小,不管数组是 int[]、float[] 还是 char[]。

【讨论】:

  • 不仅“类似于float*”,在函数参数上也完全一样。 :)
  • +1 你在几分之一秒内击败了我 :D 传递的 float[] 和 float* 之间有什么实际区别吗?
  • @daramarak:在函数参数中遇到时,no。它们完全相同。
  • 我认为在 C 语言中不允许真正的数组函数参数(一个数组返回值)是一个大错误,更糟糕的是,当他们不允许它时,他们只是改变了数组语法的用途而不是使其成为错误。
【解决方案2】:

测试了here,你看到第二个结果是 1。我怀疑(不完全确定)你的 foo 参数有指针衰减,所以它计算 sizeof(float*) 而不仅仅是 float

【讨论】:

  • float a[] 与函数参数中的float* a 相同。
猜你喜欢
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2016-05-31
相关资源
最近更新 更多