2012-02-25 2 views
0

Можно создать дубликат:
Sizeof array passed as parameterИспользование SizeOf массивов, переданных в качестве параметров

Учитывая функции ниже, я понимаю, что SizeOf возвращает размер указателя типа в массиве.

int myFunc(char my_array[5]) 
{ 
    return sizeof(my_array); 
} 

Однако вызов sizeof из массива, который не передается как параметр, обычно возвращает размер массива.

В чем причина этой непоследовательности? Каков наилучший способ получить размер массива при его передаче в качестве параметра?

+0

'полукокса [5] my_array' не является допустимым декларатором. –

+0

См. [Размер массива, переданный как параметр] (http://stackoverflow.com/questions/1328223/sizeof-array-passed-as-parameter) –

+0

[related FAQ] (http: // stackoverflow.com/questions/4810664 /) – fredoverflow

ответ

3

В чем причина этой непоследовательности?

Имя массива распадается как указатель на его первый элемент.
Когда вы передаете массив функции, это разложение происходит, и, следовательно, выражение, переданное в sizeof, является указателем, таким образом возвращающим размер указателя.

Однако массив, переданный в sizeof, всегда возвращает размер массива, потому что в этом случае нет разложения на указатель.

Каков наилучший способ получить размер массива при его передаче в качестве параметра?

Не передавать их по значению, передавать их по ссылке или
Размер прохода как отдельный аргумент функции.

4

Вам необходимо передать массив по ссылке; Вы не можете передавать массивы по значению (они распадаются на указатели на первый элемент):

int myFunc(char const (& my_array)[5]) 
{ 
    return sizeof(my_array); // or just "return 5" 
} 

В случае, если вы хотите, чтобы вызвать эту функцию с ссылкой на множество различных локальных массивов, вы можете использовать шаблон функции вместо иметь размер массива выведенный:

template <unsigned int N> 
int myFunc(char const (& my_array)[N]) 
{ 
    return sizeof(N);   // or "return N" 
} 

Вы действительно должны сделать функции возвращать unsigned int или std::size_t, хотя. В C++ 11 вы также можете объявить их как constexpr.

+0

Этот ответ в дополнение к указанию того, как получить заданный размер массива (чтобы выжить как параметр), также дает альтернативный маршрут, используя шаблоны, позволяющие использовать несколько размеров массива. Обратите внимание, что версия шаблона должна жить в файле заголовка ... – holroy

0

Когда вы передаете массив функции, вы должны вызывать функцию так же, как и далее: myFun (my_array, size), где размер представляет собой целочисленную переменную, содержит размер массива. (Здесь это myFun (my_array, 5)). и подпись функции должна быть: INT MyFunc (символ my_array [], Int размер)

0

Избегайте использовать сырые указатели использовать зЬй :: вектор вместо указателя на массив:

int myFunc(const std::vector<char>& buf) 
{ 
    return buf.size(); 
} 
Смежные вопросы