C++ 不同大小的结果

C++ 不同大小的结果,c++,c,sizeof,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); } 因为在C中不能将整个数组作为函数参数传递,实际上是传递一个指向它的指针;括号是语法上的糖。无法保证所指向的数组大小为8,因为您可以传递此函数所需的任何字符指针 // These all do the

为什么
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 as passed参数实际上只是一个指向字符数组的指针,当您获取它的
sizeof()
时,您就得到了指针的大小。在第二种情况下,将其声明为局部变量,得到整个数组的大小。

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

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

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

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

您应该得到更多的UpMODS用于您的聪明的解决方案。只需要注意模板示例是C++,而不是C. C不支持引用类型。