所以我有两个指点:
unsigned char * a;
unsigned char * b;
我们假设我使用了malloc并且它们被分配了一定的大小。 我想让指针地址的最不重要的4位相同......但我真的不知道如何。
首先,我想从a
中取出最不重要的4位。我试过像
int least = (&a) & 0x0f;
但是我收到一个错误&是一个无效的操作数。我正在考虑为b
分配更多,并搜索一个最低4位与a
相同的地址,但我真的不知道如何做到这一点。
答案 0 :(得分:4)
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
unsigned char *a;
unsigned char *b;
a = malloc(8);
b = malloc(8);
if (((uintptr_t)a & 0x0F) == ((uintptr_t)b & 0x0F)) {
printf("Yeah, the least 4 bits are the same.\n");
} else {
printf("Nope, the least 4 bits are not the same.\n");
}
free(a);
free(b);
return EXIT_SUCCESS;
}
答案 1 :(得分:2)
试试这个:
int main()
{
unsigned char *a, *b;
a = malloc(32);
b = a + 16;
printf("%p %p\n", a, b); // You should see that their least significative
// 4-bits are equal
}
由于a
和b
相距16个字节并且是连续内存块的一部分,因此它们的地址应该具有您想要的属性。
答案 2 :(得分:0)
这个怎么样:
int least;
least = (int)(&a) ^ (int)(&b); //this is a bitwise XOR, returning 0s when the bits are the same
if (least % 16) = 0 then
{
//first four bits are zeroes, meaning they all match
}
答案 3 :(得分:0)
解决此问题的一种可能方法是使用仅返回在16字节边界上对齐的分配的分配函数(因此最低有效4位将始终为零)。
某些平台具有这种对齐保证的分配功能,例如MSVC中的_aligned_malloc()
或Unix变体上的posix_memalign()
。如果你没有这样的分配器,使用普通的香草malloc()
返回一个对齐的内存块是一个常见的访谈问题 - 互联网搜索将为你提供许多可能的解决方案。