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;

取两个 char 指针之间的差,除以 2,然后乘以实际类型的大小。

通常,int 至少是 char 大小的 4 倍,因此索引会超出范围。

所以我怀疑你正在调用未定义的行为。

您需要数组/向量中的元素数,而不是字节数。

于 2013-03-04T11:52:10.397 回答