Странное поведение Memcpy / Memmove
-
25-09-2019 - |
Вопрос
У меня проблема с тем, что 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, какую ошибку программирования на моей стороне могли вызвать ее.
Спасибо
Решение
size_t size_y = sizeof(y);
sizeof(y)
уже дает вам размер всего массива, и тип должен быть size_t
.
Если вы сделаете это, y
и память y_temp
Указывает, что будет такой же размер. Вы также должны убедиться, что вы двигаетесь в правильном направлении. Прямо сейчас Y - пункт назначения. Кроме того, если источник и пункт назначения не перекрываются (которые они не будут здесь), используйте memcpy
.
Другие советы
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
Байты!