2012-04-24 35 views
2

我使用這個功能:對於結構的陣列功能段錯誤

int times_on_table(char *search,struct table index[],int wct){ 
int ct=0,num=0; 
while(ct<wct){ 
    if(strcmp(search,(index[ct].label))==0) { 
     num++; 
    } 
    ct++; 
} 
return num; 
} 

通過結構數組搜索和查找某個字符串存儲陣列中的所有時間和返回的字符串次數發生。每當我在主內使用此功能:

/*EDIT: i had a main from the wrong program my apologies*/ 

int main(int argc, char **argv){ 
    int numwds=get_num_words(argv[1]); 
    struct table index[numwds]; 

    int a; 
    struct cmd_ops symbol[22]; 
    store(argv[1],index,numwds); 
    ops_gen(symbol); 
    int b=times_on_table("in",index,numwds); 
    printf("%d",b); 
} 

該代碼工作正常。然而,當我嘗試使用某些功能裏面像這樣的

struct table* store(char *filename,struct table index[]) { 
    FILE *fp; 
    fp=fopen(filename,"r"); 
    char *a;int d=0,e=0,t=0; 
    a=malloc(60); 
    int wordcount=get_num_words(filename); 
    while(d<wordcount){ 
     fscanf(fp,"%s",a); 
     if ((index[d].label=strdup(a))==NULL) 
      break; 
     index[d].word_num=d; 

     times_on_table("this",index,wordcount);/*when i comment this out 
               of my code it runs fine*/ 

     index[d].address=findline(filename,index[d].label,wordcount,index,t); 
     d++; 
    } 
    free(a); 
} 

代碼不運行,並給了我一個分段錯誤。有什麼想法嗎?

編輯:我不知道這是否有幫助,但是當我得到段錯誤時,它甚至在執行main中的第一行代碼之前發生。

編輯:這是導致當times_on_table()被調用段錯誤的其他功能:

int findline(char *filename,char *check,int wordcount,struct table index[],int t){ 
char *a; 
a=malloc(60); 
int b=line_count(filename); 
int ch; 
fpos_t pos; 

int line=0,wd=0,loc,s=0,c=1,times; 

times=times_on_table(check,index,wordcount); 

FILE *fp; 
fp=fopen(filename,"r"); 

int list[wordcount]; 

while(c<=b){ 
    fscanf(fp,"%s",a); 
    fgetpos(fp,&pos); 

    ch=fgetc(fp);ch=fgetc(fp); 

    if(strcmp(a,check)==0){ 
     if(times==0) 
      return line; 
     else 
      times--; 
    } 

    if(ch==10){ 
     line++;c++; 
    } 
    else 
     fsetpos(fp,&pos); 
    } 
    return line; 
} 

正是在此功能,我第一次加入times_on_table(),並已分段錯誤讓我的計劃從跑步。

+1

我的想法是,你應該在調試器中運行它,以找到給出seg-fault的確切代碼行。 – 2012-04-24 18:17:11

+0

然後,您可以檢查當時各種變量的值,以確定它爲何出現故障。然後,您可以反向查找問題。 – 2012-04-24 18:17:48

+1

你有沒有試過valgrind? – 2012-04-24 18:18:29

回答

0

這裏

while(d<wordcount){ 
    fscanf(fp,"%s",a); 
    if ((index[d].label=strdup(a))==NULL) 
     break; 
    index[d].word_num=d; 

    times_on_table("this",index,wordcount); 

您嘗試算"this"的出現在wordcount多頭排列,但你只有填補了陣列的d+1插槽。其他插槽可能包含垃圾,然後訪問index[ct].label可能會導致分段錯誤ct > d

+0

在調用times_on_table()之前發生了段錯誤,甚至在store )被稱爲 – sociospiral 2012-04-24 19:34:45

+0

你怎麼知道?調用'store()'之前調用segfault的唯一機會是'get_num_words()'。但是如果崩潰,崩潰不會受到指定代碼行的影響。如果你通過調試輸出,那麼(現在刪除的)'printf(「this」);'很可能不會顯示,因爲輸出是行緩衝的。 – 2012-04-24 19:42:07

+0

如果我把一個printf(「*」);在任何東西被調用或執行之前,在main中不應該有* *因爲沒有 – sociospiral 2012-04-24 19:59:38

0

這很可能是您要通過數組索引。這兩條線真的不匹配(從您與我們分享代碼:

int wordcount=get_num_words(filename); 
times_on_table("this",index,wordcount); 

(單詞計數我認爲計數的東西在傳遞中作爲第一個參數filename,但似乎無關緊要您struct table index[]

所以在struct table index[]傳遞的參數,可能是一個不同的大小比您存入wordcount的價值。我會建議你在數組的大小作爲參數傳遞給store功能和使用,你會在你的工作main示例。示例

struct table* store(char *filename,struct table index[], int structSize){ 
.... 
times_on_table("this",index,structSize); //replace b from the call in main 
} 
+0

他不在陣列之外。他已經達到陣列從d到wordcount裏面的while循環中的函數「store」 – 2012-04-24 19:14:38

0

這可能與正確設置「index [d] .label」有關。嘗試在times_on_table()函數外部打印所有標籤,而不將其與任何內容進行比較。

+0

done,所有的標籤在times_on_table()以外打印都很好() – sociospiral 2012-04-24 19:29:27