2013-06-20 51 views
1

我在C中有一個memmove問題。據我所知,兩個位置都是有效的內存地址,我能夠在執行之前打印兩個內存位置的內容memmove,但是當我試圖移除時,該函數就會與SIGSEGV一起崩潰。Memmove和SIGSEGV在C中的問題

這裏是有問題的代碼:

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 *含有浮標的可變大小的數組。然而,數組的大小不太可能,因爲我甚至無法將它複製到單個浮點數上,儘管頁面無疑包含一個浮點數,如頁面[0]和頁面的有效輸出所證明的那樣[1]。

Cache [0]和Cache [1](索引只會是0或1,這也是確認的)都是指向先前在一個struct對象中調用的float **緩存的指針。這可以看這裏:

float** cache[2]; 
cache[0] = queryOb->cache; 
cache[1] = cache[0] + sizeOfCache/2; 

凡sizeOfCache最初用來聲明*我們要多少尺寸浮動塊釋放calloc爲queryOb->緩存。

我無法弄清楚爲什麼這個memmove正在產生一個sigsegv,我相信它可能是從一個float *到一個float **這個memmove,但是我認爲使用這兩個索引memmove會導致它開始複製到正確的位置。

任何幫助將不勝感激!

+0

memmove的最後一個參數是字節數 – doctorlove

+0

我知道,我只是試圖讓它複製一個浮動,現在它不能做 – paged90

回答

2

的memmove的定義是

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

和要調用的功能

memmove(cache[index][cache_itr], page, sizeof(float); 

只注意到cache[index][cache_itr]是數組元素存在於 值讓說(索引= 2 ,cache_itr = 3)位置cache[2][3]

您需要提供一個指針而不是值。將其更改爲

memmove(cache[index], page, sizeof(float)); 

會有意義。

此外,編譯器應該在編譯此代碼時發出警告,使其「在沒有轉換的情況下從整數生成指針」。