C中Memmove和SIGSEGV的问题

时间:2013-06-20 15:19:40

标签: c sigsegv memmove

我在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会使它开始复制到正确的位置。

非常感谢任何帮助!

1 个答案:

答案 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));

会有意义。

此外,编译器应该在编译此代码时抛出警告,以“从没有强制转换的整数生成指针”。

相关问题