FREAD C指针问题

ddd*_*ddd 1 c pointers fread

嗨,我有一个非常令人沮丧的指针问题,有人可以让我知道我在这里做错了什么。谢谢

// 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();
}
Run Code Online (Sandbox Code Playgroud)

Hea*_*utt 5

问题是你写了

fread(&ptr, BLOCK_SIZE, 1, fileptr);
Run Code Online (Sandbox Code Playgroud)

您打算:

fread(ptr, BLOCK_SIZE, 1, fileptr);
Run Code Online (Sandbox Code Playgroud)

究其原因,这是一个问题是,ptr提供给get__data_block_from_disk作为char *。因此,我假设ptr指向旨在接收结果的内存。(我希望您指出了足够的内存,但您没有提供此案例的调用代码列表。)

鉴于它ptr已经是一个指向您要将文件数据读入的内存的指针,它就是您提供给fread. 通过提供 的地址ptr,通过写入&ptr,您建议fread()覆盖存储ptr和任何相邻变量的内存。毫无疑问,这不是你想要的。

如果您犯了使用 C++ 编译器编译 C 代码的错误,请停止。但如果你是,要知道,C ++编译器会抱怨缺少的reinterpret_cast<>铸件ptrchar *void *