结果大小不同
为什么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)
C和C ++数组不是第一类对象; 你不能将数组传递给函数,它们总是衰减到指针。
但是,您可以传递指针和数组引用。 这可以防止数组边界衰减。 所以这是合法的:
template void foo(const T(&arr)[N]) { int n = sizeof(arr); }
在第一个例子中,作为传递参数的cvalue实际上只是一个指向字符数组的指针,当你获取它的sizeof()
时,你得到指针的大小。 在第二种情况下,您已将其声明为局部变量,您将获得整个数组的大小。
32位系统上的参数大小为4,使用-m64编译的64位系统的大小为8.这是因为数组作为函数中的指针传递。 指针只是一个内存地址。