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

我想知道有多少字节有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)
因为:
然而,这将工作:
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)
因为:
其他方式:
(p2-p1)*sizeof(*p1)
Run Code Online (Sandbox Code Playgroud)
这只有在工作p1和p2指向一个调用已分配的内存位置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当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异.