我正在为大学做一个t9实现,一切都已完成并正常工作,直到我开始删除一些无用的printf,我通过我的程序并得到了分段错误。过了一会儿,我可以指出一个printf(“\ n”)的原因,我刚关闭第一个文件并打开第二个文件,然后在patricia树中插入第一个单词之前。
if((fp=fopen(argv[2], "r"))==NULL){
printf("can't read %s\n", argv[2]);
exit(1);
}
/*whithout this it segfaults at the first malloc()*/
printf("\n");
while(fgets(buffer, SIZE_BUFFER, fp)){
j=0;
while(buffer[j]!='\n'){
trad[j]=TRADUCAO[buffer[j]-'a'];
j++;
}
trad[j]='\0';
buffer[j]='\0';
T=insert(trad, &T, buffer);
}
它的段落错误是这样的:
if((p=(tree)malloc(sizeof(node)))==NULL){
奇怪的是,使用这个printf(“\ n”)(或者当我从stdin而不是从文件中读取东西时),一切正常,但没有它(并且fflush不起作用),我在第一个malloc()得到了一个分段错误......这对我来说不是问题,但我真的很想知道为什么会发生这种情况,如果有人能解释的话。
编辑:我发现了问题。就在我放在这里的代码之前,我使用strlen(缓冲区)来读取我的t9字母表(它应该是可变的)并知道在带有翻译的向量上写入的位置(TRADUCAO []),忘记每个条目以'a'结尾\ n'应该被忽略,而不是'\ 0'(在文件中)。奇怪的是,这通常有效,但有时候我猜它会在没有警告的情况下编写一些内容,而后来的malloc()调用会失败。我所做的就是改变 len=strlen(buffer);
到
len=0; while(buffer[len]!='\n') len++;
一切正常。我很遗憾浪费每个人的时间(如果有人想看代码,我很乐意分享它)......