不同大小的结果

时间:2020-03-05 18:49:07  来源:igfitidea点击:

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

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

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

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

解决方案

回答

因为我们不能在C中将整个数组作为函数参数传递。括号是语法糖。不能保证我们要指向的数组的大小为8,因为我们可以向此函数传递任何想要的字符指针。

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

回答

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

回答

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

回答

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

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

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