2008-09-08 136 views
15

为什么n在下面的函数中不等于8不同尺寸的结果

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

n确实等于8在这个版本的功能:

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

回答

45

因为你不能将整个数组作为函数参数C.你实际上是在传递指针对它;括号是句法糖。不能保证你指向的数组大小为8,因为你可以通过这个函数任意你想要的字符指针。

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

更喜欢语法氰化物... – 2015-12-21 12:23:07

1

在第一个例子,cvalue作为传递的参数是真的只是一个指向一个字符数组,当你把它的sizeof(),你得到的指针的大小。在第二种情况下,您已将其声明为局部变量,您将获得整个数组的大小。

0

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

14

C和C++数组不是头等对象;你不能将数组传递给函数,它们总是衰减到指针。

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

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

你值得拥有更多的upmods为你的聪明的解决方案。 – 2009-05-20 11:03:27