关于c ++:结果的大小不同

关于c ++:结果的大小不同

Different sizeof results

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

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

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

1
2
3
4
5
void bar()
{
  char cvalue[8];
  int n = sizeof (cvalue);
}

因为您不能在C中将整个数组作为函数参数传递。实际上,您正在传递指向它的指针。括号是语法糖。不能保证您要指向的数组的大小为8,因为您可以将所需的任何字符指针传递给此函数。

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

C和C ++数组不是一流的对象。您不能将数组传递给函数,它们总是衰减到指针。

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

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


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


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


推荐阅读