0

を使用して、メモリブロックから連続して保存された2つの整数を読み取ろうとしています(ブロックvoid *blockの内容を指すポインターがあります) memcpy。最初のものは、次を使用して問題なく読み取られます。

memcpy(&test, block, sizeof(int));

私は次を使用して2番目を読み込もうとします:

memcpy(&test, block + sizeof(int), sizeof(int));

(もちろん、私はプログラムの異なる実行インスタンスにこれらのステートメントを持っているので、問題はテストがオーバーライドされているということではありません)

しかし、私は正しい結果を得ることができません! ここで何が間違っていますか?

4

4 に答える 4

6

これは非標準です:

void *block = ...; 
block + sizeof(int); // where does this point to?

ポインター演算を実行する場合は、最初に既知のサイズの型にキャストします (ポインターの加算は、基になる型のサイズで暗黙的に乗算され、sizeof(unsigned char)常に 1 になります)。

void *block = ...;
(unsigned char *) block + sizeof(int);

または、さらに簡単なバージョンを使用して、

void *block = ...;
(int *) block + 1;

したがって、最終的なコードは次のとおりです。

int test;
void *block = ...;
memcpy(&test, block, sizeof(test));
// do something...?
memcpy(&test, (int *) block + 1, sizeof(test));

または、より単純なバージョン、

int test[2];
void *block = ...;
memcpy(&test, block, sizeof(test));

次のことはしないでください。

test = *(int *) block;

が整列されていない場合、一部のシステム (通常は SIGBUS) でクラッシュしますblock

于 2012-04-16T22:38:17.207 に答える
1

最初のものは、次を使用して問題なく読み取られます。

memcpy(&test, block + sizeof(int), sizeof(int));

私は次を使用して2番目を読み込もうとします:

memcpy(&test, block + sizeof(int), sizeof(int));

それは同じコードです...したがって、同じことを行います(変更していないtestblock、呼び出しの間にあると仮定しますが、表示されていません)。

の最初の値を上書きしています&test。test が int へのポインターであり、そのうちの 2 つを保持するのに十分な有効なメモリがあると仮定します...

int test[2];
memcpy(test, block, sizeof(test));

Iftestはただのintthen...

int a, b;
memcpy(&a, block, sizeof(a));
memcpy(&b, (int*)block + 1, sizeof(b));
于 2012-04-16T22:27:47.340 に答える
0

同じメモリ位置を 2 回読み取っています。おそらく次のようなものが必要です。

int test;
memcpy(&test, (char *)block + 0*sizeof(int), sizeof(int));
printf("%d\n",test);
memcpy(&test, (char *)block + 1*sizeof(int), sizeof(int));
printf("%d\n",test);

これは (意図的に) 非常に冗長であることに注意してください。より簡潔な修正は次のようになります。

int test[2];
memcpy(test, block, 2*sizeof(int));
printf("%d\n%d\n",test[0],test[1]);
于 2012-04-16T22:27:31.470 に答える
-1

同じアドレスから両方の int を読み取ります。また、この方法は冗長すぎます。試す:

int *a = (int *)block;

次に、それらを簡単に取得できa[0]ますa[1]

于 2012-04-16T22:30:11.943 に答える