嗨,我有一个非常令人沮丧的问题,指针可能有人让我知道我在这里做错了什么。 感谢
// 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 :(得分: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 *
。
答案 1 :(得分:3)
你不想要混合lseek和fread。如果在文件描述符上使用lseek,请在文件描述符上使用read。如果你在FILE *上使用fread,请在FILE *上使用fseek。混合两者几乎肯定不会给你你想要的东西。
答案 2 :(得分: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第一个参数应该是一个指针,当你写&amp; ptr时,你会发送指针内存地址。