我有两个指针:
unsigned char * a;
unsigned char * b;
让我们假设我使用了malloc,并且它们被分配了一定的大小。我想让指针地址的最低有效的4位是相同的…但我真的不知道怎么做。
首先,我想从a
中取出最低有效的4位。我尝试了
int least = (&a) & 0x0f;
但是我得到一个错误&是无效的操作数。我想为b
分配更多,并寻找与a
相同的最低有效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;
}
试试这个:
int main()
{
unsigned char *a, *b;
a = malloc(32);
b = a + 16;
printf("%p %pn", a, b); // You should see that their least significative
// 4-bits are equal
}
由于a
和b
相隔16字节,并且是连续内存块的一部分,因此它们的地址应该具有您想要的属性。
解决此问题的一种可能方法是使用分配函数,该函数只返回按16字节边界对齐的分配(因此最不重要的4位将始终为零)。
一些平台有这样的对齐保证分配函数,如MSVC中的_aligned_malloc()
或Unix变体中的posix_memalign()
。如果你没有这样一个可用的分配器,使用普通的malloc()
返回一个对齐的内存块是一个常见的面试问题——在互联网上搜索一下会为你提供许多可能的解决方案。
这个呢:
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
}