2011-11-16 68 views
1

这是一个函数调用(所以它只是整个程序的一部分)。它会产生分段错误。我想这是由“指针是一个局部变量”造成的?本地指针分割错误?

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”,我可以做到这一点,而不需要自由分配给“指针”的内存?

+0

你或许应该作出这样的修改一个单独的问题。 – Mysticial

回答

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; 
} 
+0

感谢您的回答!我马上离开这个函数,因为我想简化它,只提取产生问题的代码。 NODE * pointer = malloc(sizeof(NODE)); - >这样做会有所帮助,但我不明白为什么我需要这个。你能帮助澄清我的误解吗? – LKS

+0

在你的原始代码中,'p​​ointer'没有指向任何有效的地方,因为它没有被初始化。当'fread'尝试写入它时,它崩溃。 'malloc',将分配内存并返回指针。现在'fread'将写入由'malloc'分配的内存。另外请注意,当你像这样分配内存时,你需要稍后释放它,否则你将会发生内存泄漏。 – Mysticial

+0

谢谢,我现在明白了! – LKS