2011-04-22 72 views
0

嗨,我有一個非常令人沮喪的問題,指針可能有人讓我知道我在這裏做錯了什麼。 感謝FREAD C指針問題

// This functions reads from the file 
void get__data_block_from_disk(char* ptr, int block_num){ 
    int file_desc; 
    int x; 
    open_fs(file_path); 
    file_desc = fileno(fileptr); 
    x = lseek(file_desc, DATA_BLOCK_OFFSET + block_num*BLOCK_SIZE, SEEK_SET); 
    fread(&ptr, BLOCK_SIZE, 1, fileptr); 
    close_fs(); 
} 

// This function writes to the file 
void place__data_block_into_disk(char* ptr, int block_num){ 
    int file_desc; 
    int x; 
    printf("char in place: %c\n", ptr); 
    open_fs(file_path); 
    file_desc = fileno(fileptr); 
    x = lseek(file_desc, DATA_BLOCK_OFFSET + block_num*BLOCK_SIZE, SEEK_SET); 
    fwrite(ptr, BLOCK_SIZE, 1, fileptr); 
    close_fs(); 
} 
+0

你預計會發生什麼,你會得到什麼? – 2011-04-22 21:14:08

回答

4

問題是你寫

fread(&ptr, BLOCK_SIZE, 1, fileptr); 

,你打算:

fread(ptr, BLOCK_SIZE, 1, fileptr); 

的原因,這是一個問題是,ptr提供給get__data_block_from_disk作爲char *。因此,我假設ptr指向旨在接收結果的內存。 (我希望你已經指出足夠內存,但你有沒有針對這種情況提供了調用代碼的列表。)

鑑於ptr已經是一個指向內存,你想讀的文件數據進入,它是您提供給fread的指針。通過提供地址ptr,通過編寫&ptr,建議fread()覆蓋存儲ptr和任何相鄰變量的內存。毫無疑問,這不是你想要的。

如果您犯的錯誤是用C++編譯器編譯C代碼,請停止。但是,如果你是,請注意,C++編譯器會抱怨reinterpret_cast<>鑄件ptr缺少char *void *

+0

謝謝你,你的解釋有多大意義。 – ddd 2011-04-22 22:07:21

+0

很酷。如果這個或其他答案讓你感到不安,請點擊幫助答案旁邊的複選標記。這標誌着你的問題「回答」,並給予收件人15分。 :) – 2011-04-22 22:41:19

2
fread(&ptr, BLOCK_SIZE, 1, fileptr); 

應該

fread(ptr, BLOCK_SIZE, 1, fileptr); 

或代替你改變

void get__data_block_from_disk(char* ptr, int block_num){ 

void get__data_block_from_disk(char** ptr, int block_num){ 

fread(&ptr, BLOCK_SIZE, 1, fileptr); 

fread(*ptr, BLOCK_SIZE, 1, fileptr); 

說明:

FREAD第一個參數是一個指針,當你寫& PTR您在指針內存ADRESS發送。

+1

第二次如何改變幫助?如果使用'* ptr'而不是'&ptr',這是有道理的,但這是相反的情況。 – 2011-04-22 21:18:44

+0

我感到困惑,當然第二個只會在* ptr而不是&ptr的時候才起作用。感謝您爲我指出:) – rzetterberg 2011-04-22 21:23:27

+0

而且,假設你運行這樣的函數:get__data_block_from_disk(&ptr,1); – rzetterberg 2011-04-22 21:24:55

3

你做不是想混合lseek和fread。如果在文件描述符上使用lseek,請使用讀取文件描述符。如果您在FILE *上使用fread,請在FILE *上使用fseek。混合兩者幾乎肯定不會給你想要的東西。

+0

這是如此的真實。 – 2011-04-23 19:12:38