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

时间:2014-03-22 22:03:18

标签: c pointers ubuntu 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);
}

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

2 个答案:

答案 0 :(得分: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);
}

你也可以写:

    uintptr_t minLoc = absLoc & ~(uintptr_t)0x0F;

另见Solve the memory alignment in C interview question that stumped me

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

答案 1 :(得分:0)

我可能没有完全理解这个问题,但对我而言,看起来好像你正在尝试做好旧的hexdump?

void hexdump(char *buf, int size)
{
    int i;

    for (i = 0; i < size; i++)
    {
        if (i % 16 == 0)
        {
            puts("");
            printf("%p", &buf[i]);
        }

        printf("%02x ", buff[i]);
    }
}