我如何知道2个指针之间的距离(以字节为单位)? 例如:
我想知道p2和p1之间有多少字节(在本例中为3)因为用p1到达p2我必须做3步...
step1 p1在B
中
step2 p1在C
中
step3 p1在D
所以我需要回到我身边3
我问这类问题是因为我正在实施lz77算法
答案 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);
由于:
然而将工作:
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);
由于:
答案 1 :(得分:7)
另一种方式:
(p2-p1)*sizeof(*p1)
仅当p1
和p2
指向在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当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素;结果是两个数组元素的下标不同。