2

memcpy を使用しようとしていますが、

実行時エラー: セグメンテーション エラー (コア ダンプ)

およびコンパイラ警告: 警告: 異なるサイズの整数からポインターへのキャスト [-Wint-to-pointer-cast]

これがコードです

unsigned char JMP[6] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
unsigned long JMPSize = ...;

//copy jump size to jump instruction at second byte (this is where i get the error)
memcpy((uint8_t*)JMP[1],(void*)JMPSize, 4);
4

2 に答える 2

5

どちらJMP[1]JMPSizeポインターではありません。これは、memcpyが変数の実際の値をポインターとして解釈することを意味し、ポインターはどこか離れた場所を指し、未定義の動作につながります。

&それらをポインターにするには、アドレス演算子を使用する必要があります。

memcpy(&JMP[1], &JMPSize, 4);

一般に、関数がvoid *引数を取るか、または を返すvoid *場合、型をキャストしないでください。型をキャストしないと警告が表示され、多くの場合、警告は未定義の動作を示します。

于 2013-10-01T15:02:12.963 に答える
1

どちらでもないJMPか、JMPSizeポインターではなく、値です。したがって、変数をポインタにキャストすると、 memcpy は に格納されてJMP[0]いるアドレス番号から に格納されているアドレス番号にコピーしようとしますJMPSize。これらのメモリ位置はおそらく有効ではないため、プログラムのセグメンテーション違反が発生します。

代わりに、変数を参照する必要があります。これが&C の演算子の目的です。

memcpy(&JMP[1], &JMPSize, 4);
于 2013-10-01T15:03:29.853 に答える