配列(実際の配列)がある場合は、この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
}
リファクタリングを行い、コードが配列が減衰した場所に移動した場合 (または静的配列を動的に割り当てられた配列に置き換えた場合)、コンパイラはサイズの計算を修正する必要があることを通知します。