Проблема указателя FREAD C - PullRequest
       17

Проблема указателя FREAD C

1 голос
/ 23 апреля 2011

Привет, у меня действительно расстраивающая проблема с указателями, может кто-нибудь сообщить мне, что я делаю здесь неправильно.Спасибо

// 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();
}

Ответы [ 3 ]

4 голосов
/ 23 апреля 2011

Проблема в том, что вы написали

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 *.

3 голосов
/ 23 апреля 2011

Вы не хотите смешать lseek и fread. Если вы используете lseek для файлового дескриптора, используйте read для файлового дескриптора. Если вы используете fread на ФАЙЛЕ *, используйте fseek на ФАЙЛЕ *. Сочетание двух почти наверняка не даст вам того, что вы хотите.

2 голосов
/ 23 апреля 2011
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); 

to

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

Объяснение:

Первый параметр Fread должен быть указателем, а когда вы пишете & ptr, вы отправляете в адрес памяти указателей.

...