在c中使用由指针变量保存的地址上的模数

Zap*_*Tap 3 c ubuntu pointers modulo

作为类的程序的一部分,我必须以特定的方式打印输出,分成16个字节的块.我一直在寻找一种将指针转换为int或其他方式来对存储在变量中的指针地址执行模数或除法运算的方法.我遇到了障碍,这里的任何人都知道如何执行这个看似简单的操作吗?这是函数的基本形式:

void printAddress(char *loc, char *minLoc, char *maxLoc) {
    minLoc = (loc - (loc % 16));
    maxLoc = minLoc + 16;
    printf("%p - %p - %p", minLoc, loc, maxLoc);
}
Run Code Online (Sandbox Code Playgroud)

我删除了所有我投射它的尝试,以明确我正在尝试做什么.

Jon*_*ler 6

您正在寻找的类型uintptr_t定义于<stdint.h>.它是一个无符号整数类型,足以容纳任何指向数据的指针.格式在<inttypes.h>.它们允许您正确格式化代码.包含时<intttypes.h>,也没有必要包括在内<stdint.h>.假设你有一个64位处理器,我选择了16; 如果您使用的是32位处理器,则可以使用8.

void printAddress(char *loc)
{
    uintptr_t absLoc = (uintptr_t)loc;
    uintptr_t minLoc = absLoc - (absLoc % 16);
    uintptr_t maxLoc = minLoc + 16;
    printf("0x%16" PRIXPTR " - 0x%16" PRIXPTR " - 0x%16" PRIXPTR "\n",
           minLoc, absLoc, maxLoc);
}
Run Code Online (Sandbox Code Playgroud)

你也可以这样写:

    uintptr_t minLoc = absLoc & ~(uintptr_t)0x0F;
Run Code Online (Sandbox Code Playgroud)

另请参阅在C面试问题中解决内存对齐问题.

请注意,理论上可能uintptr_t是未定义的系统; 我知道没有系统实际上不能支持它(但我不知道所有系统).

  • uintptr_t的要点是将指针视为普通的无符号整数类型. (2认同)