[英]Problems with Memmove and SIGSEGV in C
我在C中的记忆体存在一些问题。据我所知,这两个位置都是有效的内存地址,我可以在执行记忆体之前打印两个记忆体位置的内容,但是,一旦尝试记忆,函数将因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 **,而页面是float *,其中包含一个可变大小的float数组。 但是,数组的大小不太可能成为问题,因为即使页面确实包含浮点数,我也无法将其复制到单个浮点数上,这可以通过page [0]和page的有效打印来证明[1]。
Cache [0]和Cache [1](索引将永远只有0或1,这也得到了确认)都是指向struct对象内先前调用的float **缓存的指针。 可以在这里看到:
float** cache[2];
cache[0] = queryOb->cache;
cache[1] = cache[0] + sizeOfCache/2;
最初使用sizeOfCache来声明我们要为queryOb-> cache调用多少个float *大小的块。
我无法弄清楚我的一生为什么这个记忆体会产生sigsegv,我相信这可能与从float *到float **的记忆体有关,但是我认为在记忆体上使用两个索引会导致开始复制到正确的位置。
任何帮助将非常感激!
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));
会很有意义。
同样,编译器在编译此代码时应发出警告“使指针从整数生成而不进行强制转换”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.