2011-11-16 66 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