【问题标题】:Getting Segmentation fault while searching in a file在文件中搜索时出现分段错误
【发布时间】:2013-05-03 08:56:44
【问题描述】:

我正在为一个包含“info”类型信息的简单数据库编写代码。

这是我的代码:

#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) 错误。

请你在这里指出我的错误好吗?

【问题讨论】:

  • 您尝试过任何调试工具吗?试试gdb,不错。
  • 是时候学习如何使用调试器了(例如,Linux 上的gdb,它有一个带有教程材料的nice documentation)。
  • 另外,不要忘记传递-Wall(甚至可能还有-Wextra)——除了-g来获取调试信息——到gcc(或g++) ,如果您改进代码直到没有给出警告,它将对您有很大帮助。

标签: c memory-management segmentation-fault


【解决方案1】:

代码

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

get 中尝试将sizeof(struct info) 字节写入未初始化的指针temp。你需要为temp分配内存。

最简单的方法可能是修改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 */
}

【讨论】:

    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 2017-06-16
    • 2020-11-06
    • 2013-04-15
    • 2022-10-04
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    相关资源
    最近更新 更多