2012-04-24 46 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