结果大小不同

时间:2008-09-08 02:31:39

标签: c++ c sizeof

为什么n在以下函数中不等于8

void foo(char cvalue[8])
{
  int n = sizeof (cvalue);
}

但在此版本的函数中,n 等于8

void bar()
{
  char cvalue[8];
  int n = sizeof (cvalue);
}

4 个答案:

答案 0 :(得分:46)

因为你无法将整个数组作为C中的函数参数传递。你实际上是在向它传递一个指针;括号是句法糖。无法保证您指向的数组大小为8,因为您可以将此函数传递给您想要的任何字符指针。

// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)

答案 1 :(得分:14)

C和C ++数组不是第一类对象;你不能将数组传递给函数,它们总是衰减到指针。

但是,您可以传递指针和数组引用。这可以防止数组边界衰减。所以这是合法的:

template<typename T, size_t N>
void foo(const T(&arr)[N])
{
    int n = sizeof(arr);
}

答案 2 :(得分:1)

在第一个例子中,作为传递参数的cvalue实际上只是一个指向字符数组的指针,当你获取它的sizeof()时,你得到指针的大小。在第二种情况下,您已将其声明为局部变量,您将获得整个数组的大小。

答案 3 :(得分:0)

32位系统上的参数大小为4,使用-m64编译的64位系统大小为8.这是因为数组作为函数中的指针传递。指针只是一个内存地址。