我在使用C语言编程时遇到了最奇怪的问题。我的函数有时会运行,有时则不运行,即使我尝试搜索这些错误(检测到堆栈粉碎并且没有getenv的来源)我可以'似乎找到了有时为什么失败的答案。我尝试调试它,它只在最后一个字符(“}”)中有问题,所以它运行所有其他功能(并且它们已经分别进行了大量测试)但有时它只是分崩离析并且没有运行最后一个函数(它可以工作,我可以保证,因为有些时候它甚至在这个函数内运行)。此外,我最后一次运行该函数它给了Segmentation Fault,即使有时它一直运行到最后。有什么方法可以调试这个问题吗?这是我的代码:
void main(int argc, char * argv[]) {
FILE * fin=fopen(argv[1],"r");
char v[1024];
int col;
matrix m=emptyS();
while(fscanf(fin, "%s",v)!=EOF) {
int i=0;
int * w = (int*) malloc(sizeof (int));
int str=strlen(v);
int size=0;
while(i<str) {
char a[4];
int y;
for(y=0;y<4;y++)
a[y]='\0';
int x=0;
while(v[i]!=',') {
a[x]=v[i];
i++;
x++;
}
i++;
size++;
w=realloc(w,size*sizeof(int));
w[size-1]=atoi(a);
}
m=add(m,w,size);
col=size;
}
fclose(fin);
graphW wg=discWD(col-1);
int k=0;
while(k<(col-2)) {
int j=k+1;
while(j<(col-1)) {
wg=add_Wedge(wg,k,j,mi(m,k,j,col));
j++;
}
k++;
}
int* ms=MST(wg);
graph gbayes=tree(wg,ms);
bayes b=newBN(gbayes,m);
FILE * fout=fopen(argv[2],"w");
serialize(b,fout);
fclose(fout);
}
提前谢谢!
答案 0 :(得分:3)
您不会检查x
是否越界。 Valgrind会告诉你的。
while(i<str) {
char a[4] = { 0 };
int x=0;
while(v[i]!=',') {
a[x]=v[i]; /* here you access a[x] without check for x */
i++;
x++; /* Here it may go >= 4*/
}
i++;
size++;
w=realloc(w,size*sizeof(int));
w[size-1]=atoi(a);
}