Другие языки программирования и технологии

C++ Везде написано, что sizeof() с массивом в качестве аргумента возвращает полный размер. А в данной функции не так.

Собственно почему sizeof(x) в main() возвращает 32 а в функции 5?




Вот код:

#include <iostream>

#include <cstdlib>

using namespace std;

//template <class sum>

inline void fcn(double x[], double& res)

{

for(int i = sizeof(x); i != 0; ) //Why sizeof(x) returs 4 instead of 32?

{

res += x[--i];

//cout << res << " " << x[i] << " " << i << endl;

}

}

int main(void)

{

double x[] = {2, 2, 2, 2};

double res = 0;

fcn(x, res);

cout << res ;

system ("pause");

return 0;

}

Потому что это параметр функции, даже явное добавление размера не спасет ситуацию.
Вот что пишет в warnings, например, LLVM/clang:

Users/..../main.cpp:13:19: Sizeof on array function parameter will return size of 'double *' instead of 'double []'

<EDIT>при передачи параметра-массива в функцию обычно просто указатель суется в стек или регистры, потому так и сделано в Стандарте. Не зря же язык Си "машинно-независимым ассемблером" называют</EDIT>
Используйте std::vector вместо массивов, если задача на плюсах нормально научиться писать стоит.

Ну и по мелочам: return 0; из main происходит сам по себе, значит, если используете правило хорошего тона "не писать лишний код, пользоваться кодом, сгенеренным по умолчанию", то return 0 там лишний. И у меня он на паузу выругался (нет такой команды, кстати, это единственная непортируемость в Вашем коде) , в этом плане лучше через cin что-нибудь ввести.
Артур Мкртчян
Артур Мкртчян
19 662
Лучший ответ
Потому что, внутри главной функции определяется размер массива. Т. е. 4-е ячейки по 8 байт (тип дабл) . А в функции фсн параметром является не массив, а указатель на первый байт массива. Адрес указателя на первый элемент массива помещается в ячейку типа интеджер. Ячейка типа интеджер размером 4-е байта.
---------------------
Т. е. в первом случае определяется размер массива состоящего из четырёх ячеек размером по 8 байт. А во втором случае определяется размер одной ячейки в четыре байта.
------------------------
Кури о передаче функции указателя.

============================================
Могу и ошибаться. Забыл уже.