1

次のデータ構造があります。

typedef struct {
      size_t d; /* dimension of elements*/
      TFComp fid; TFComp ord; /* fid and ord are some comparation functions*/
      char *v, *s, *t; /* v points to the starting point of vector; s points to end of usable area of vector; t points to the end of available area */
      } TMultime;

および宣言:

TMultime *m;

char *p=m->v; /* starting point */
char *q=m->s;  /* end of usable area of vector */

そしてそれを言いましょうm->d = sizeof(int);

このベクトルの真ん中を見つけたいです。

私は試した*middle = p + (q - p)/2 * m->d;

そしてそれは失敗します。ベクトルに含まれていない値が得られます。

私はそれを正しくするためにいくつかの助けが必要です.

4

2 に答える 2

2

(可能性のある移植性の問題は無視しましょう)

配列の物理的な中央へのポインタは

char *m = p + (q-p)/2;

p と q は char へのポインタであるためです。ただし、注意してください: 式は char の配列の中央を計算します! サイズ m->d のブロックに関して中央を指すポインターを取得するには、次の式を使用します。

char *m = p + ((q-p)/(2*m->d))*m->d;
于 2013-03-04T11:56:11.053 に答える
1

これ:

*middle = p + (q - p)/2 * m->d;

2 つの char ポインターの差を取り、2 で割り、実際の型のサイズを掛けます。

通常、int は char のサイズの少なくとも 4 倍であるため、範囲外のインデックスになります。

したがって、未定義の動作を呼び出していると思われます。

バイト数ではなく、配列/ベクトルの要素数が必要です。

于 2013-03-04T11:52:10.397 に答える