-1

だから私は2つのポインタを持っています:

unsigned char * a;
unsigned char * b;

malloc を使用し、特定のサイズが割り当てられていると仮定しましょう。ポインターのアドレスの最下位 4 ビットを同じにしたいのですが、方法がわかりません。

まず、 から最下位 4 ビットを取得しaます。私は何かを試しました

int least = (&a) & 0x0f;

しかし、 & が無効なオペランドであるというエラーが表示されます。もっと割り当てbて、最下位4ビットが同じアドレスを検索しようと思っていましaたが、どうすればそれができるのか本当にわかりません。

4

4 に答える 4

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;
}
于 2013-04-29T17:08:53.780 に答える
0

この問題を解決する 1 つの可能な方法は、16 バイト境界に整列された割り当てのみを返す割り当て関数を使用することです (したがって、最下位 4 ビットは常にゼロになります)。

_aligned_malloc()一部のプラットフォームには、MSVC やposix_memalign()Unix バリアントなど、アラインメントが保証された割り当て関数があります。そのようなアロケーターが利用できない場合、単純なバニラを使用して整列されたメモリ ブロックを返すことmalloc()は、面接でよく聞かれる質問です。インターネット検索で、多くの可能な解決策が見つかります。

于 2013-04-29T17:48:35.683 に答える
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
}
于 2013-04-29T17:18:18.140 に答える