0

このコードは、最後の行でセグメンテーション違反を発生させます。ヘッダーは、すべて 0 の連続したメモリ ブロックへのポインターであり、残りを逆参照すると 0 が返されますが、これはおそらく問題に関連しています。私はまだこれがうまくいくはずだと感じていますが、何が問題なのですか?

void setHeader(void *header, size_t payload) {
   size_t *remainder = (size_t*)((char *)header + (payload + 4));
   *remainder = payload;
}
4

1 に答える 1

0

なぜこれがうまくいくと思いますか?指すオブジェクトが十分に大きく、追加payload + 4してもオブジェクトのサイズを超えない場合を除き、ポインター演算の動作は未定義です。演算が定義されている場合でも (たとえば、オブジェクト サイズが正確に である場合payload + 4)、配列の末尾の 1 つ後ろのスロットを逆参照すると UB が発生します。コードが機能するためには、アドレスを渡すオブジェクトが十分に大きいことを確認する必要があります。

于 2012-08-11T23:08:24.560 に答える