gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:07:32 25 4
gpt4 key购买 nike

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

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

我删除了所有尝试施放它的尝试,以明确我要做什么。

最佳答案

您要找的类型是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没有定义;我知道没有哪个系统实际上不能支持它(但我不知道所有系统)。

关于c - 在c中指针变量保存的地址上使用模数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22584213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com