0

私はデータ構造コースにいます。中間試験が近づいており、中間試験の練習では、各行が有効な構文であるかどうかを尋ねられます。

int num = 10;
int *p, *q;
p = #

q = p;  //valid
*p = q; //invalid, int* cannot be assigned to int
(*p)++; //valid
&num+1; //valid ********
p++;    //valid ********

コードの最後の 2 行は、私が理解しているように、num 変数のアドレスに 1 を追加します。

これは、コーディングにおいてどのような目的を持つでしょうか?

4

2 に答える 2

0

これがコーディングで持つであろう目的は、次のようなテストを書くことです:

void f ( size_t length, int data[length] )
{
  assert( 0 == length % 4 );
  for ( int* p = data; p < data + length; p += 4 )
    do_stuff_with_subarray( p, 4 );

  return;
}

ループ条件p < data + lengthは、ポインターを配列の末尾の 1 つ後ろのアドレスと比較することにより、ポインターの境界チェックを行います。このアドレスを逆参照すると未定義の動作になりますが、それと比較するとそうではありません。(ただし、この単純な例ではdo_stuff_with_subarray()、長さが 4 で割り切れない配列の末尾を超えて読み取ると、UB が発生します。)

于 2015-10-16T22:29:53.450 に答える