Странное поведение memcpy / memmove - PullRequest
1 голос
/ 27 сентября 2010

У меня проблема в том, что 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, поэтому я искал подсказку, какая ошибка программирования на моей стороне могла это вызвать.

Спасибо

Ответы [ 2 ]

4 голосов
/ 27 сентября 2010
size_t size_y = sizeof(y);

sizeof(y) уже дает размер всего массива, а тип должен быть size_t.

Если вы сделаете это, y и память, на которую указывает y_temp, будут одинакового размера. Вы также должны убедиться, что вы движетесь в правильном направлении. Прямо сейчас, y это пункт назначения. Кроме того, если источник и пункт назначения не перекрываются (чего они не будут здесь), используйте memcpy.

1 голос
/ 27 сентября 2010
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 байтов!

...