Различные результаты по размеру

Почему 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. Это связано с тем, что массивы передаются как указатели в функциях. Указатель - это просто адрес памяти.