如何从另一个指针中减去指针的地址?

时间:2015-04-22 18:30:22

标签: c pointers

我有一个用于在C中编写malloc的HW赋值。对于释放指针的整个算法的一部分,我需要减去我们正在使用的堆的地址然后进行一些位操作。所以我有以下两个声明,稍后在我的程序中定义。

void* heap;  
 metadata_t* ptr; //always < 8kb from heap

我的目标是获取堆的地址并从ptr中减去它,因为我执行的位操作只有在最左边的位为零时才有效。到目前为止,我所尝试过的所有内容都会导致错误。有谁知道我该怎么做?

1 个答案:

答案 0 :(得分:0)

简短的回答是减法&#34;只是工作&#34;,并返回整数类型的结果。

#include <stdio.h>

int main(int argc, const char * argv[]) {
    char string[] = "This is a test string";
    char *a = string+8;
    char *b = string+10;
    long x = b-a;

    printf("Hello, World! a and b are %ld bytes apart\n", x);
    return 0;
}

更长的答案 - 如果您要进行很多算术运算,将指针强制转换为适当大的整数类型,请执行算术运算,然后将它们转换回指针。这本质上是不可移植的,但是您正在编写malloc,因此在关注列表中可移植性可能不高。

事情可能有点棘手,因为你可能想要一个无符号整数类型来保留指针的所有位,但是对C中的无符号类型进行算术可能很烦人。