1

Cのソケットを介してメモリアドレスを送受信したい.私が持っているものは次のとおりです:

void *ptr = malloc(122); /* So the pointer points to some valid address */
unsigned char *socketData = NULL;

socketData = (unsigned char*)malloc(sizeof(void*));
memset(socketData, 0, sizeof(void*));

/* ??? How to get the memory address - where ptr points to - to socketData ??? */

を使用してポインターアドレスを出力する方法はprintf、を使用することです。%p

printf("%p", ptr);

ただし、これはたとえば 0x0021ef1a を出力します。私が欲しいのは次のとおりです: 0021ef1a

受信側では、受信したバイトを変換して に戻す方法はvoid*?

ああ: コードは 32 ビットでも 64 ビット システムでも動作するはずです ;) さらに、コードは -Wall -Werror を使用してコンパイルする必要があります。

助けてくれてありがとう!良い週末を、ジョナス

4

2 に答える 2

6

あなたの質問に答えるために、もう一度コピーするだけで生データをポインターに戻すことができます。

void *ptr = malloc(42);
void *ptr2 = NULL;

unsigned char *data = malloc(sizeof(void *));

memcpy(data, &ptr, sizeof(void *));

...

memcpy(&ptr2, data, sizeof(void *));

printf("ptr  = %p\n", ptr);
printf("ptr2 = %p\n", ptr2);

ほとんどの場合、ソケットを介してポインターを送信することはほとんど意味がないことに注意してください。ポインター値は、たまたま送信者とまったく同じプロセスでない限り、受信者にとっては役に立ちません。各プロセスには、個別の仮想アドレス空間があります。

提案されたアプリケーションを考えると、受信者側では、これをポインターで表現することを検討することをお勧めします。その形式では役に立たないからです。代わりに、適切な大きさの整数型に格納してみませんか?

于 2011-02-20T17:21:09.560 に答える
0

ポインターをフォーマットしprintf()て別のホストに送信して表示する場合は、次sprintf()の方法が正しい方法です。

char dest[100] = "";
snprintf(dest, sizeof dest, "%p", ptr);

これにより、リモート ホストでそのまま処理できる固定長の文字列が作成されます。この利点は、受信側ホストが送信側ホストのポインター サイズと形式の詳細を知る必要がないことです。

于 2011-02-21T01:15:13.533 に答える