Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c语言中截断地址_C - Fatal编程技术网

如何在c语言中截断地址

如何在c语言中截断地址,c,C,我正在用C写一个hextump函数 如何将给定的地址void*start截断为小于给定start参数的16的最大倍数? 有没有一个简单的方法可以做到这一点? 谢谢假设void*地址包含您的原始地址: unsigned long int multiple = (unsigned long int)address/16; void *new_address = (void*)(16 * multiple;) 除以16将得到整数值 uintptr_t rounded = ((uintptr_t)

我正在用C写一个hextump函数

如何将给定的地址void*start截断为小于给定start参数的16的最大倍数? 有没有一个简单的方法可以做到这一点? 谢谢

假设void*地址包含您的原始地址:

unsigned long int multiple =  (unsigned long int)address/16;
void *new_address = (void*)(16 * multiple;) 
除以16将得到整数值

uintptr_t rounded = ((uintptr_t)start) & ~0xF;
请注意,来自C99的uintptr\u t是一个无符号整数,保证足够大,可以在平台上保存指针


位移位将最低的4位置零,因此是16的倍数。

@user2817587,我建议您使用它,但不要与“int”一起使用。改为使用无符号long。地址总是无符号的,这种转换很可能导致地址错误。在C++中,你会使用siZig?比如UnpTrtRT Stand和0xFU?对于已经以四个零位结尾的地址0x123F0,您想要什么?最佳解决方案。严格阅读OP的问题,您可能需要uintpttr_tstart-1&~0x0F ah-在直接减去1之前是否需要将start强制转换为char类型?
uintptr_t x = ((uintptr_t)addr) & ~((1 << 4) - 1);