そのようにprintf()に構造体を渡すことはできません。メンバーの1つ、またはメンバーから作成された値を渡します。
timeval構造体の定義を実装固有の詳細までたどると、次のようなものが見つかる可能性があります。
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
これが言うことは、(少なくともこの特定のプラットフォームでは)メモリ内の値とそれに続くマイクロ秒の値で構成される構造がメモリ内にあるということです。これらの2つの値は、構造体のメンバーを構成します。
select()などの関数には、構造体自体へのポインターを指定する必要があります。最初のメンバーへのポインタは、多くの場合、その値と同じrawメモリアドレスを持っている可能性がありますが、形式的または移植性のある互換性はなく、構造体ポインタとして誤用された場合は警告が表示されます。
printf()のようなジェネリックプレーン値関数はtimeval構造体の知識がないため、理解できる数値型として解釈できる構造体メンバー、または構造体メンバーを組み合わせて作成された値のいずれかを指定する必要があります。たとえば、両方のフィールドを使用して64ビット時間をミリ秒単位で計算し、64ビットのprintf形式指定子で表示することは非常に一般的です。