C - 2个指针之间的距离

时间:2014-08-11 16:12:52

标签: c pointers

我如何知道2个指针之间的距离(以字节为单位)? 例如: Distance between p1 and p2

我想知道p2和p1之间有多少字节(在本例中为3)因为用p1到达p2我必须做3步... step1 p1在B
中 step2 p1在C
中 step3 p1在D

所以我需要回到我身边3
我问这类问题是因为我正在实施lz77算法

2 个答案:

答案 0 :(得分:10)

您可以尝试:

ptrdiff_t bytes = ((char *)p2) - ((char *)p1);

但是,如果你减去的指针指向相同的单个内存或在其中,则 only 按预期工作。例如:

不会按预期工作:

char *p1 = malloc(3); // "ABC", piece 1
char *p2 = malloc(3); // "DEF", piece 2
char *p3 = malloc(3); // "GHI", piece 3

ptrdiff_t bytes = p3 - p1; // ABC ... DEF ... GHI
                           // ^               ^
                           // p1              p3
                           // Or:
                           // GHI ... ABC ... DEF
                           // ^       ^
                           // p1      p3

// Gives on my machine 32
printf("%td\n", bytes);

由于:

  • malloc实现可以为内部目的(例如内存屏障)分配一些额外的字节。这会影响结果字节。
  • 不保证p1< p2< P3。所以你的结果可能是负面的。

然而工作:

char *p1 = malloc(9);  // "ABCDEFGHI", one piece of memory
char *p2 = p1 + 3;     // this is within the same piece as above
char *p3 = p2 + 3;     // this too

ptrdiff_t bytes = p3 - p1; // ABC DEF GHI
                           // ^       ^
                           // p1      p3



// Gives the expected 6
printf("%td\n", bytes);

由于:

  • 分配的 9字节将始终位于一个内存中。因此,这将永远是真的:p1< p2< p3,因为填充/附加字节在片段减法的开始/结束时将起作用。

答案 1 :(得分:7)

另一种方式:

(p2-p1)*sizeof(*p1)

仅当p1p2指向在malloc系列函数中调用时分配的内存位置时,此方法才有效。

这是有效的:

int* p1 = malloc(sizeof(int)*20);
int* p2 = p1+10;

int  sizeInBytes = (p2-p1)*sizeof(*p1);

这是无效的:

int* p1 = malloc(sizeof(int)*20);
int* p2 = malloc(sizeof(int)*10);

int  sizeInBytes = (p2-p1)*sizeof(*p1); // Undefined behavior

更新,以回应@chux的评论

根据C标准草案(ISO / IEC 9899:201x):

  

6.5.6加法运算符

     

...

     

9当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素;结果是两个数组元素的下标不同。