我正在修改一段bind的源代码,特别是rdataset.c文件的随机顺序部分,如下所示:
for (i = 0; i < count; i++) {
dns_rdata_t rdata;
isc_uint32_t val;
isc_random_get(&val);
choice = i + (val % (count - i));
rdata = shuffled[i];
shuffled[i] = shuffled[choice];
shuffled[choice] = rdata;
if (order != NULL)
sorted[i].key = (*order)(&shuffled[i], order_arg);
else
sorted[i].key = 0; /* Unused */
sorted[i].rdata = &shuffled[i];
}
Run Code Online (Sandbox Code Playgroud)
我改变了选择的行,让变量取自这样的函数
choice=weightCal();
Run Code Online (Sandbox Code Playgroud)
而功能代码是
unsigned int weightCal() {
FILE *file = fopen("weight.txt", "r");
double integers[10],prob[10];
unsigned int i=0,j=0,k=0;
double sum=0,subSum=0,num;
unsigned int result=0;
while(fscanf(file, "%lf", &num) > 0) {
integers[i] =num;
sum+=num;
i++;
}
rewind(file);
while(fscanf(file, "%lf", &num) > 0){
subSum=subSum+num;
prob[j]= subSum / sum;
j++;
}
srand(time(NULL));
double r = rand() / (double)RAND_MAX;
for(k=0;k<sizeof(prob)/sizeof(double);k++) {
if (r < prob[k]) {
result=k;
break;
}
}
fclose(file);
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后我重新编译绑定.编译工作,但当我使用命令时:
dig www.example.com. @127.0.0.1
Run Code Online (Sandbox Code Playgroud)
它返回错误"Segmentation fault(core dumped)".我试图调试它,调试器告诉我错误是在行
while(fscanf(file, "%lf", &num) > 0)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
好了,检查file是不是NULL-这是一个很好的起点.像一条线
while(fscanf(file, "%lf", &num) > 0)
Run Code Online (Sandbox Code Playgroud)
如果出现问题file(无效指针或内部数据结构损坏),通常会崩溃.虽然如果文件中的输入值超出double类型范围,某些平台可能会崩溃.
此外,根据本地数据在平台上的布局方式,覆盖超出其中一个数组末尾的内存可能会破坏其值file,将其转换为无效指针.您永远不会在任何周期中检查越界访问.您确定您的输入文件恰好有10个数据值吗?(注意,函数中的最后一个循环可能会迭代10个元素,这意味着不到10个元素就不会这样做).