嗨,我有一个非常令人沮丧的指针问题,有人可以让我知道我在这里做错了什么。谢谢
// 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)
问题是你写了
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<>铸件ptr从char *到void *。