Различные результаты по размеру
Почему n
не равно 8
в следующей функции?
void foo(char cvalue[8])
{
int n = sizeof (cvalue);
}
Но n
соответствует 8
в этой версии функции:
void bar()
{
char cvalue[8];
int n = sizeof (cvalue);
}
Ответы
Ответ 1
Потому что вы не можете передать целые массивы в качестве функциональных параметров в C. Вы фактически передаете указатель на него; скобки - синтаксический сахар. Нет гарантий, что массив, на который вы указываете, имеет размер 8, так как вы можете передать этой функции любой желаемый указатель символов.
// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
Ответ 2
C и С++ массивы не являются объектами первого класса; вы не можете передавать массивы в функции, они всегда распадаются на указатели.
Однако вы можете передавать указатели и ссылки на массивы. Это предотвращает затухание границ массива. Итак, это законно:
template<typename T, size_t N>
void foo(const T(&arr)[N])
{
int n = sizeof(arr);
}
Ответ 3
В первом примере cvalue как переданный параметр на самом деле является только указателем на массив символов, и когда вы берете с ним sizeof()
, вы получаете размер указателя. Во втором случае, когда вы объявили его как локальную переменную, вы получите размер всего массива.
Ответ 4
Размер параметра в 32-битных системах будет 4, а в 64-битных системах, скомпилированных с -m64, будет 8. Это связано с тем, что массивы передаются как указатели в функциях. Указатель - это просто адрес памяти.