我在C中有一些memmove的问题。据我所知,两个位置都是有效的内存地址,我能够在执行memmove之前打印两个内存位置的内容,但是只要我尝试memmove,该函数与SIGSEGV崩溃。
以下是相关代码:
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 **,而page是一个float *,它包含一个可变大小的浮点数组。然而,数组的大小是不可能的,因为我甚至不能让它复制到一个浮点数,尽管页面无疑包含一个浮点数,如页面[0]和页面的有效打印所证明的那样[1]。
Cache [0]和Cache [1](索引只会是0或1,这也是确认的)都是指向struct对象中float **的先前calloc-ed缓存的指针。这可以在这里看到:
float** cache[2];
cache[0] = queryOb->cache;
cache[1] = cache[0] + sizeOfCache/2;
其中sizeOfCache最初用于声明有多少块大小为float *我们想要calloc用于queryOb-&gt;缓存。
我无法弄清楚为什么这个memmove正在产生一个sigsegv,我相信这可能与从一个浮动*到一个浮点数的memmove做了但是我认为使用两个指数memmove会使它开始复制到正确的位置。
非常感谢任何帮助!
答案 0 :(得分:2)
Memmove的定义是
void* memmove( void* destination, const void* source, size_t num );
你正在调用函数
memmove(cache[index][cache_itr], page, sizeof(float);
注意到cache[index][cache_itr]
是数组元素的值
让我们说(对于index = 2,cache_itr = 3)位置cache[2][3]
您需要提供指针而不是值。将其更改为
memmove(cache[index], page, sizeof(float));
会有意义。
此外,编译器应该在编译此代码时抛出警告,以“从没有强制转换的整数生成指针”。