用本地指针分段错误?

时间:2011-11-16 06:29:00

标签: c

这是一个函数调用(因此它只是整个程序的一部分)。它会产生分段错误。我想这是由“指针是一个局部变量”引起的?

int fileExists(const char *fname){
    int i = 0;
    fseek(fs, sizeof(NODE)*i, SEEK_SET);
    NODE* pointer;
    fread(pointer, sizeof(NODE), 1, fs);
    return 1;
}

更新:

typedef struct node {
    char fname[MAX_NAME];
    short fstart;
} NODE;

int findStart (const char *fname){
    fs = fopen("Directory", "w+");
    NODE* pointer = malloc(sizeof(NODE));
    int i;
    for(i=0;i<numberNodes;i++){
        fseek(fs, sizeof(NODE)*i, SEEK_SET);
        fread(pointer, sizeof(NODE), 1, fs);
        if(strcmp(pointer->fname, fname)==0)
            return pointer->fstart;
    }
    return 0;
}

因此,如果我想运行目录文件中的节点并找到正确节点的“fstart”,我是否可以实现这一点而无需释放分配给“指针”的内存?

1 个答案:

答案 0 :(得分:4)

问题在于:

NODE* pointer;
fread(pointer, sizeof(NODE), 1, fs);

您从未为NODE分配任何空格。

NODE* pointer = malloc(sizeof(NODE));

但是,我不确定你的目的是什么,因为你立即离开了这个功能。不要忘记稍后free指针。

根据函数fileExists的名称,您可能需要做的只是尝试打开文件,检查文件是成功还是失败,然后返回。这里的所有代码都是不必要的。

这样的事情(几乎)会做我认为你想要的事情:

int fileExists(const char *fname){
    FILE *file = fopen(fname,"r");
    if (file == NULL)
        return 0;
    fclose(file);
    return 1;
}

编辑:回答新问题。

要完全避免malloc,首先可以将NODE作为局部变量放在堆栈中:

int findStart (const char *fname){
    fs = fopen("Directory", "w+");
    NODE node;
    int i;
    for(i=0;i<numberNodes;i++){
        fseek(fs, sizeof(NODE)*i, SEEK_SET);
        fread(&node, sizeof(NODE), 1, fs);
        if(strcmp(node.fname, fname)==0)
            return node.fstart;
    }
    return 0;
}