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);

これが問題である理由は、がとしてptr提供されているためです。したがって、結果を受け取るためのメモリへのポイントを想定しています。(十分なメモリを指摘していただければ幸いですが、この場合の呼び出しコードのリストを提供していません。)get__data_block_from_diskchar *ptr

ptrファイル データを読み込もうとしているメモリへのポインタであるとすれば、それは に提供するそのポインタですfread。のアドレスを指定することによりptr、 を書き込むことにより、保存されているメモリと隣接する変数を上書きするように&ptrアドバイスしています。間違いなく、これは意図したものではありません。fread()ptr

C コードを C++ コンパイラでコンパイルするという間違いを犯している場合は、中止してください。ただし、そうである場合は、C++ コンパイラがからへのreinterpret_cast<>キャストの欠如について文句を言うことに注意してください。ptrchar *void *

于 2011-04-22T21:14:26.467 に答える
3

lseekとfreadを混ぜたくないファイル記述子でlseekを使用する場合は、ファイル記述子でreadを使用してください。FILE *でfreadを使用する場合は、FILE*でfseekを使用してください。2つを混合しても、ほぼ確実に必要なものが得られません。

于 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 に答える