2013-06-20 3 views
1

У меня возникли проблемы с memmove в C. Насколько я могу судить, оба местоположения являются действительными адресами памяти, я могу распечатать содержимое обоих мест памяти до того, как я выполню memmove, однако, как только я попытаюсь выполнить memmove, функция выйдет из строя с помощью SIGSEGV.Проблемы с Memmove и SIGSEGV в C

Вот код в вопросе:

std::cout << page[0] << "\n"; 
std::cout <<page[1] << "\n" ; 
std::cout << cache[index][cache_itr] << "\n"; 

memmove(cache[index][cache_itr],page,sizeof(float)); 

//These lines never print. 
std::cout << cache[index][cache_itr] << "\n"; 
std::cout << cache[index][cache_itr] << "\n"; 

Кэш объявляется как поплавок **, и страница с плавающей точкой *, который содержит массив переменного размера поплавков. Однако размер массива, являющегося проблемой, маловероятен, поскольку я даже не могу его скопировать по одному плаву, несмотря на то, что страница, несомненно, содержит поплавок, о чем свидетельствует действительная печать из обеих страниц [0] и страницы [1].

Кэш [0] и кэш [1] (индекс будет только когда-либо равным 0 или 1, это также подтверждено) являются указателями на ранее запрограммированный кеш float ** внутри объекта struct. Это можно увидеть здесь:

float** cache[2]; 
cache[0] = queryOb->cache; 
cache[1] = cache[0] + sizeOfCache/2; 

Где sizeOfCache первоначально используется, чтобы объявить, сколько блоков размера поплавка * мы хотим calloc для queryOb-> кэша.

Я не могу понять всю жизнь, почему эта memmove производит сигсегв, я полагаю, что это может быть связано с memmove от float * до float **, однако я думал, используя два индекса на memmove заставит его начать копирование в нужное место.

Любая помощь была бы высоко оценена!

+0

Последний параметр memmove - это количество байтов – doctorlove

+0

Я знаю, я просто пытаюсь заставить его скопировать один плавающий прямо сейчас, чего он не может сделать – paged90

ответ

2

Определение Memmove является

void* memmove(void* destination, const void* source, size_t num); 

и вы вызываете функцию

memmove(cache[index][cache_itr], page, sizeof(float); 

Просто заметил, что cache[index][cache_itr] является значение элемента массива присутствующих на позволяет говорить (для индекса = 2 , cache_itr = 3) location cache[2][3]

Вам необходимо указать указатель, а не значение. Изменение его на

memmove(cache[index], page, sizeof(float)); 

будет иметь смысл.

Кроме того, компилятор должен бросить предупреждение при компиляции этого кода для «делает указатель из целого без литья».

Смежные вопросы