2016-11-16 2 views
0

Предположим, есть указатель на массив значений с плавающей точкой: float *source; и мы знаем, его размер, как int sourcesize;Функция memmove имеет тот же адрес, что и временный указатель?

Существует уже реализована функция добавления элемента в souce массив из inputVec:

void addRecord(const float* inputVec, int& sourcesize) 
{ 
    int inputVecSize = sourcesize; 
    memmove((float*)&(source[inputVecSize]), inputVec, sizeof(float)); 
} 

Теперь я хочу скопировать 1 элемент из m-го элемента исходного массива и прикрепить его к исходному концу. Используя addRecord выше, я реализовал функцию, как показано ниже:

// suppose m is smaller than the current sourcesize 
void copyRecord(const float* source, int& m) 
{ 
    float* temporary = new float; 
    memcpy(temporary, (float*)&(source[m]), sizeof(float)); 
    addRecord(temporary, sourcesize); 
    delete temporary; 
} 

Кажется memmove вызова функции addRecord может разделить переменное расположение временных. Таким образом, возможно, я не должен удалять temporary в конце. Но я думаю, может быть, они не разделяют один и тот же адрес, тогда я должен удалить temporary в этом случае.

Итак, должен ли я удалить temporary в конце концов или нет?

Или, есть лучший способ скопировать элемент из массива source в его конец с помощью функции addRecord?

+1

Этот код не имеет надежды на работу, если вы копируете 'm' floats для произвольного одиночного поплавка. Я бы настоятельно рекомендовал вам использовать контейнеры стандартной библиотеки, такие как 'std :: vector', для хранения этих данных. – tadman

+2

'sizeof (JtFloat32)' и 'sizeof (float)' могут быть не такими же, иначе зачем 'JtFloat32'? Если они отличаются, 'float * tempor = new float; memcpy (временный, (JtFloat32 *) & (источник [m]), sizeof (JtFloat32)); 'проблема. – chux

+2

Вам нужно 'JtFloat32 * временное = новое JtFloat32 [m]' в * абсолютном наименее *. Вы также должны изменить подпись метода на 'JtFloat32 * ', чтобы избежать кастинга. – tadman

ответ

1

memmove() копирует содержание с учетом того, что temporary указывает на. Эта копия не зависит от оригинала temporary, поэтому совершенно безопасно удалить ее после вызова memmove().

Но в первую очередь нет необходимости в временном, вы можете скопировать непосредственно из исходного массива.

addRecord(&(source[m]), sizeof source[m]); 
Смежные вопросы