【发布时间】:2010-09-08 02:55:42
【问题描述】:
为什么n在下面的函数中不等于8?
void foo(char cvalue[8])
{
int n = sizeof (cvalue);
}
但是n 确实在这个版本的函数中等于8:
void bar()
{
char cvalue[8];
int n = sizeof (cvalue);
}
【问题讨论】:
为什么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<typename T, size_t N>
void foo(const T(&arr)[N])
{
int n = sizeof(arr);
}
【讨论】:
在第一个示例中,作为传递参数的 cvalue 实际上只是一个指向字符数组的指针,当您获取它的 sizeof() 时,您会得到指针的大小。在第二种情况下,您已将其声明为局部变量,您将获得整个数组的大小。
【讨论】:
参数的大小在 32 位系统上为 4,而在使用 -m64 编译的 64 位系统上为 8。这是因为数组在函数中作为指针传递。指针只是一个内存地址。
【讨论】: