C语言 如何确保两个地址的最低有效4位相同



我有两个指针:

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
}

由于ab相隔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
}

相关内容

  • 没有找到相关文章

最新更新