繁体   English   中英

C中的Memmove和SIGSEGV问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM