在c语言中使用指针变量保持的地址上的模
作为类程序的一部分,我必须以特定的方式打印输出,将输出分成16个字节的块。我一直在寻找一种将指针强制转换为int的方法,或者另一种对存储在变量中的指针地址执行模或除法余数操作的方法。我遇到了一个路障,这里有人知道我怎么做这个看似简单的操作吗?以下是函数的基本形式:在c语言中使用指针变量保持的地址上的模,c,pointers,ubuntu,modulo,C,Pointers,Ubuntu,Modulo,作为类程序的一部分,我必须以特定的方式打印输出,将输出分成16个字节的块。我一直在寻找一种将指针强制转换为int的方法,或者另一种对存储在变量中的指针地址执行模或除法余数操作的方法。我遇到了一个路障,这里有人知道我怎么做这个看似简单的操作吗?以下是函数的基本形式: void printAddress(char *loc, char *minLoc, char *maxLoc) { minLoc = (loc - (loc % 16)); maxLoc = minLoc + 16;
void printAddress(char *loc, char *minLoc, char *maxLoc) {
minLoc = (loc - (loc % 16));
maxLoc = minLoc + 16;
printf("%p - %p - %p", minLoc, loc, maxLoc);
}
我删除了所有铸造它的尝试,以明确我要做的事情。您要查找的类型是
uintpttr\t
,在
中定义。它是一个无符号整数类型,大到足以容纳任何指向数据的指针。格式为
。它们允许您正确格式化代码。当您包含
时,不必也包含
。我选择16,假设您有一个64位处理器;如果使用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;
另见
注意,理论上可能存在一个系统,其中未定义
uintpttr\t
;我知道没有一个系统不能真正支持它(但我不知道所有的系统)。我可能不完全理解这个问题,但对我来说,它看起来好像你在尝试做一个好的旧hextump
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]);
}
}
void hextump(char*buf,int size)
{
int i;
对于(i=0;i
你能进一步说明你打算做什么吗?我只是对你的要求有点困惑。你说你需要输出16字节的数据块,但是这个函数甚至没有开始显示那么大的数据块…我只是误解了吗?如果你能澄清,那会很有帮助的!是的,对不起!到目前为止,我只是做了关于找到街区起点和终点的部分。我将文本文件的内容存储在内存中,我正在搜索字符给定的ascii值。当我找到它时,我打印字符的地址和它周围的数据,从16的倍数开始。因此,如果是低地址,loc可以指向26的地址,在这种情况下,我需要打印16到31的地址块。您的问题之一是,您试图打印指针的整数表示。指针的正确转换说明符是%p
@ciphermagi我修正了问题中的问题-我仍然需要找到块的边界。现在,使用这种方法有什么缺点吗?或者,出于所有意图和目的,它会被视为任何其他整数类型吗?uintptr_________________________________________________________,因为编译器在你背后做的所有内部对齐的事情都可能被作废。不过,99.99%的案例中不会出现这种情况;)uintpttr\u t
是一种普通的旧无符号整数类型;它由系统专门指定为一个类型,而不一定是一个标准类型,它的大小足以容纳数据指针。如果系统使用96位数据指针并支持128位无符号整数类型,则uintpttr\u t
可能是该128位无符号类型的别名。@Pod:如果您修改该值,使其超出指针最初指向的任何数组(或值)的界限,您就如履薄冰了。如果您的修改将修改后的值保留在数组的边界内,并且具有适当对齐的值,则极不可能遇到问题。但从理论上讲,这是一种可移植性责任,因此在迁移代码时,您应该仔细地将代码隔离在系统中需要仔细检查可移植性假设的部分。