2013-06-20 25 views
1

我在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"; 

高速缓存被声明为浮动**,和页面是float *含有浮标的可变大小的数组。然而,数组的大小不太可能,因为我甚至无法将它复制到单个浮点数上,尽管页面无疑包含一个浮点数,如页面[0]和页面的有效输出所证明的那样[1]。

Cache [0]和Cache [1](索引只会是0或1,这也是确认的)都是指向先前在一个struct对象中调用的float **缓存的指针。这可以看这里:

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

凡sizeOfCache最初用来声明*我们要多少尺寸浮动块释放calloc为queryOb->缓存。

我无法弄清楚为什么这个memmove正在产生一个sigsegv,我相信它可能是从一个float *到一个float **这个memmove,但是我认为使用这两个索引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)位置cache[2][3]

您需要提供一个指针而不是值。将其更改为

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

会有意义。

此外,编译器应该在编译此代码时发出警告,使其“在没有转换的情况下从整数生成指针”。