2

ボイドポインタを作成し、そのボイドポインタにメモリのセクションをmallocした場合、割り当てたばかりの個々のビットを出力するにはどうすればよいですか?

例えば:

void * p;
p = malloc(24);
printf("0x%x\n", (int *)p);

上記で割り当てた24ビットを出力したいと思います。

4

6 に答える 6

5
size_t size = 24;
void *p = malloc(size);

for (int i = 0; i < size; i++) {
  printf("%02x", ((unsigned char *) p) [i]);
}

もちろん、それは未定義の動作を引き起こします (によって割り当てられたオブジェクトの値はmalloc不確定な値を持ちます)。

于 2013-02-01T22:51:25.893 に答える
2
void print_memory(void *ptr, int size)
{ // Print 'size' bytes starting from 'ptr'
    unsigned char *c = (unsigned char *)ptr;
    int i = 0;

    while(i != size)
        printf("%02x ", c[i++]);           
}

H2CO3 が述べたように、初期化されていないデータを使用すると、未定義の動作が発生しますが、上記の抜粋は必要な動作をするはずです。電話:

print_memory(p, 24);
于 2013-02-01T22:53:14.860 に答える
2

できません-内容を初期化する前にこれらのバイトを読み取ると、未定義の動作が発生します。ただし、これをどうしてもやりたい場合は、次のことを試してください。

void *buf = malloc(24);
unsigned char *ptr = buf;
for (int i = 0; i < 24; i++) {
    printf("%02x ", (int)ptr[i]);
}

free(buf);
printf("\n");
于 2013-02-01T22:52:56.973 に答える
1

void* p = malloc(24);24 バイトを割り当て、最初のバイトのアドレスを に格納しますp。の値を出力しようとすると、p実際にはアドレスが出力されます。ポインターが指す値を出力するには、 を使用して逆参照する必要があります*voidまた、可能であればポインターを避けるようにしてください。

unsigned char *p = malloc(24);
// store something to the memory where p points to...
for(int i = 0; i < 24; ++i)
    printf("%02X", *(p + i));

freeそして、によって割り当てられたメモリを忘れないでくださいmalloc:)

この質問もあなたを助けることができます:ポインターの「逆参照」とはどういう意味ですか?

于 2013-02-01T22:55:59.413 に答える
0

mallocビット単位ではなくバイト単位で割り当てます。それが何であれprintf、メモリ内のアドレスを印刷しようとしています。

于 2013-02-01T22:51:02.423 に答える
0

malloc はバイトを割り当てます。

 for (i = 0; i < 24; ++i) printf("%02xh ", p[i]);

24バイトを出力します。ただし、int にキャストする場合は、ループを調整する必要があります。

 for (i = 0; i < 24; i += sizeof(int)) printf("%xh", *(int *)&p[i]);

しかし、int が必要であることがわかっている場合は、単に int として宣言しないのはなぜでしょうか?

于 2013-02-01T22:52:27.173 に答える