1

memcpy / memmovestruct FOO fooが、関数のsrcでも宛先でもないのポインタを変更するという問題があります。gdbの出力は次のとおりです。

memmove(y,y_temp,size_y);

(gdb) p y
$38 = 0xbff7a2e0
(gdb) p y_temp
$39 = (float *) 0x815ea20
(gdb) p foo
$40 = (FOO *) 0x81d4e90

以降:

(gdb) p y_temp
$41 = (float *) 0x343434
(gdb) p y 
$42 = 0x343434 
(gdb) p foo
$43 = (FOO *) 0x343434

変数の定義は次のとおりです。

FOO *foo;
float y[nsamples];
float size_y = nsamples*sizeof(y);
float* y_temp = (float*) malloc(size_y);

私はそれがmemcpy/moveのバグではないことを知っているので、私はヒントを探しています。私の側のプログラミングエラーがそれを引き起こした可能性があります。

ありがとう

4

2 に答える 2

4
size_t size_y = sizeof(y);

sizeof(y)すでに配列全体のサイズを示しており、タイプは。である必要がありますsize_t

これを行うyと、メモリy_tempポイントは同じサイズになります。また、正しい方向に進んでいることを確認する必要があります。現在、yが宛先です。また、送信元と宛先が重複していない場合(ここでは重複しません)、を使用しますmemcpy

于 2010-09-27T12:28:48.720 に答える
1
float y[nsamples];
/* let's say a float is 4 bytes and nsamples is 13 */
float size_y = nsamples*sizeof(y);
/* size_y is now 13 * 52 == 676 */

そして、あなたはします

memmove(y, y_temp, size_y);

しかし、すべてのバイトyに十分なスペースがありません!size_y

于 2010-09-27T12:30:59.647 に答える