memcpy / memmove的奇怪行为

时间:2010-09-27 12:26:02

标签: c memory-management memcpy memmove

我遇到的问题是memcpy / memmove更改了struct 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的错误,所以我在寻找一个tipp,我身边的编程错误可能导致它。

由于

2 个答案:

答案 0 :(得分:4)

size_t size_y = sizeof(y);

sizeof(y)已经为您提供了整个数组的大小,类型应为size_t

如果这样做,y和内存y_temp指向的大小相同。你还应该确保你朝着正确的方向前进。现在,y是目的地。此外,如果源和目标不重叠(它们不在此处),请使用memcpy

答案 1 :(得分: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个字节!