C - 2个指针之间的距离

Gio*_*Far 4 c pointers

我如何知道2个指针之间的字节距离?例如: p1和p2之间的距离

我想知道有多少字节有P2和P1之间(在这种情况下3),因为与P1我必须做3个步骤达到P2 ...
第一步P1在B
第二步P1在C
步骤3 P1为d

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

d3L*_*d3L 10

你可以尝试:

ptrdiff_t bytes = ((char *)p2) - ((char *)p1);
Run Code Online (Sandbox Code Playgroud)

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

不会按预期工作:

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);
Run Code Online (Sandbox Code Playgroud)

因为:

  • 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);
Run Code Online (Sandbox Code Playgroud)

因为:

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

  • 如果两个指针指向相同的有效缓冲区,则应该是正确的,例如`p1 ="foo"; p2 = strchr(p1,'x');`(差异为3).否则,未定义的行为. (2认同)

R S*_*ahu 7

其他方式:

(p2-p1)*sizeof(*p1)
Run Code Online (Sandbox Code Playgroud)

这只有在工作p1p2指向一个调用已分配的内存位置malloc的家庭功能.

这是有效的:

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

int  sizeInBytes = (p2-p1)*sizeof(*p1);
Run Code Online (Sandbox Code Playgroud)

这是无效的:

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

int  sizeInBytes = (p2-p1)*sizeof(*p1); // Undefined behavior
Run Code Online (Sandbox Code Playgroud)

更新,以响应@chux的评论

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

6.5.6加法运算符

...

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

  • @ d3l,这不是真的.`p2-p1`是`p1`和`p2`之间类型`*p1`的元素数.运行代码:http://ideone.com/zHI5aP (3认同)
  • @chux,添加了更新.我找不到更重要的东西.但是,从常识的角度来看,如果`p1`和`p2`是两次调用`malloc`的结果,我们就无法期待`p2-p1`的可预测值. (3认同)