1

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

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

3 回答 3

5

问题是你写了

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

您打算在哪里:

fread(ptr, BLOCK_SIZE, 1, fileptr);

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

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

如果您犯了使用 C++ 编译器编译 C 代码的错误,请停止。但如果你是的话,请注意 C++ 编译器会抱怨缺少从to的reinterpret_cast<>转换。ptrchar *void *

于 2011-04-22T21:14:26.467 回答
3

不想混合使用 lseek 和 fread。如果对文件描述符使用 lseek,请对文件描述符使用 read。如果您在 FILE * 上使用 fread,请在 FILE * 上使用 fseek。将两者混合几乎肯定不会给您想要的东西。

于 2011-04-23T04:08:08.827 回答
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 时你发送指针内存地址。

于 2011-04-22T21:15:53.807 回答