Различный размер результатов - PullRequest
16 голосов
/ 08 сентября 2008

Почему n не равно 8 в следующей функции?

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

Но n делает равным 8 в этой версии функции:

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

Ответы [ 4 ]

46 голосов
/ 08 сентября 2008

Потому что вы не можете передавать целые массивы как параметры функции в C. На самом деле вы передаете указатель на него; скобки синтаксические сахара. Нет никаких гарантий, что массив, на который вы указываете, имеет размер 8, так как вы можете передать этой функции любой символьный указатель, какой захотите.

// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
14 голосов
/ 08 сентября 2008

C и C ++ массивы не являются объектами первого класса; Вы не можете передавать массивы в функции, они всегда распадаются на указатели.

Однако вы можете передавать указатели и ссылки на массивы. Это предотвращает разрушение границ массива. Так что это законно:

template<typename T, size_t N>
void foo(const T(&arr)[N])
{
    int n = sizeof(arr);
}
1 голос
/ 08 сентября 2008

В первом примере cvalue в качестве переданного параметра на самом деле представляет собой просто указатель на массив символов, и когда вы берете его sizeof(), вы получаете размер указателя. Во втором случае, когда вы объявили его как локальную переменную, вы получите размер всего массива.

0 голосов
/ 08 сентября 2008

Размер параметра в 32-разрядных системах будет равен 4, а в 64-разрядных системах, скомпилированных с -m64, - 8. Это связано с тем, что массивы передаются в виде указателей в функциях. Указатель является просто адресом памяти.

...