-1

タイプ「情報」の情報を保持する単純なデータベースのコードを書いています。

これが私のコードです:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>


#define NAME_LENGTH 20
#define EMAIL_LENGTH 15

struct info {
    char name[NAME_LENGTH];
    char email[EMAIL_LENGTH];
    int flag;
};

int createDB(char *name) {
    FILE * file = fopen(name, "w+b");
    return fclose(file);
}

FILE *openDB(char *name) {
    FILE* file = fopen(name, "r+b");
    if(file != NULL) return file;
    return NULL;
}

int closeDB(FILE *f) {
    return fclose(f);
}

struct info *get(FILE *file, int index) {
    struct info* temp;
    fseek(file, index*sizeof(struct info), SEEK_SET);
    fread(temp, 1, sizeof(struct info), file);
    if(feof(file) != 0) return NULL;
    return temp;

}

int put(FILE *file, int index, struct info *record) {
    fseek(file, index*sizeof(struct info), SEEK_SET);
    int res = fwrite(record, 1, sizeof(struct info), file);
    if(res) return 0;
    else return EOF;
}

struct info *search(FILE *file, char *name) {
    int k = 0;
    struct info* temp = get(file, 0);
    do {

        if(temp -> flag == 1 && strcmp(temp -> name,name) == 0) return temp;
        k++;
        temp = get(file, k);

    }while(temp != NULL);

    return temp;
}

ファイルから情報を「配置」、「取得」すると、すべて正常に動作します。しかし、名前で検索しようとすると、Segmentation fault (core dumped)エラーが発生します。

ここで私の間違いを見せていただけますか?

4

1 に答える 1

5

コード

struct info* temp;
...
fread(temp, 1, sizeof(struct info), file);

inは、初期化されていないポインタにバイトgetを書き込もうとします。にメモリを割り当てる必要があります。sizeof(struct info)temptemp

これを行う最も簡単な方法は、の署名を変更して、呼び出し元がスタックからインスタンスgetを使用できるようにすることです。info

int get(FILE *file, int index, struct info *record) {
    fseek(file, index*sizeof(*record), SEEK_SET);
    fread(record, 1, sizeof(*record), file);
    if(feof(file) != 0) return -1;
    return 0;
}

次のように呼び出すことができます

struct info record;
if (get(file, 0, &record) == -1) {
    /* eof */
}
于 2013-05-03T08:59:06.067 に答える