Если и когда у вас есть массив (настоящий), вы можете использовать трюк sizeof(array)
, но учтите, что если вы реорганизуете код и толкаете его куда-то, где массив превратился в указатель (или если память была изначально Выделенный в указателе (malloc / new) вам нужно будет передать известный размер.
Игнорирование относительных размеров источника и места назначения, то есть, если предположить, что они одинаковы для остальной части обсуждения, если вы используете C ++, я бы порекомендовал трюк метапрограммирования, который даст вам типоразмерный размер для массивов не скомпилируется, если вы попытаетесь использовать его с указателями:
template <typename T, int N>
inline int array_memory_size( T (&a)[N] ) { return sizeof a; }
Таким образом:
int main() {
int array[10];
int *ptr = array;
int orig[10] = { 0 };
memcpy( array, orig, array_memory_size(array) ); // ok
//memcpy( ptr, orig, array_memory_size(ptr) ); // compilation error
}
Если в любой момент вы проведете рефакторинг и код переместится в место, где массив распался (или вы замените статический массив на динамически размещаемый), компилятор скажет вам, что вам нужно исправить вычисление размера.