我对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*,它包含一个可变大小的float数组。然而,数组的大小不太可能成为一个问题,因为我甚至无法让它在单个浮点上进行复制,尽管事实上,页面无疑包含一个浮点,这可以从页面[0]和页面[1]的有效打印得到证明。
Cache[0]和Cache[1]都是指向struct对象中先前调用的float**缓存的指针(索引将仅为0或1,这也得到确认)。这里可以看到:
float** cache[2];
cache[0] = queryOb->cache;
cache[1] = cache[0] + sizeOfCache/2;

其中size of cache最初用于声明大小浮动块的数量*我们要为queryOb->cache调用oc。
我一辈子都搞不懂为什么这个memmove会产生一个sigsegv,我相信这可能与memmove从float*到float*有关,但是我认为在memmove上使用这两个索引会导致它开始复制到正确的位置。
任何帮助都将不胜感激!

最佳答案

Memmove的定义是

void* memmove( void* destination, const void* source, size_t num );

你调用函数
memmove(cache[index][cache_itr], page, sizeof(float);

刚刚注意到cache[index][cache_itr]
假设(索引=2,缓存=3)位置cache[2][3]
您需要提供一个指针而不是值。把它改成
 memmove(cache[index], page, sizeof(float));

会有意义的。
此外,编译器在编译此代码时应抛出警告,以“使指针从整数开始而不进行强制转换”。

关于c - C中的Memmove和SIGSEGV问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17217539/

10-09 18:29