在算法中使用小数字时出现意外的分段错误

问题描述:

我正在使用统计算法,并且一直出现分段错误,而我无法看到它。我很确定我已经正确调用了内存。我想知道是否它可能与下溢有关,因为我只在循环的几次迭代后才得到错误。代码如下,以及我的printf的调试。对不起,如果在这里的语法有点混乱,我正在从期刊出版。在算法中使用小数字时出现意外的分段错误

// *** n and m defined previously 
float *aux_arr = calloc(n, sizeof(float)); 
if (aux_arr == NULL) { 
    printf("calloc failed"); 
} 

int j; 
int j0 = 1; 
int j1 = 1; 
aux_arr[1] = 1; 

for (size_t i = 0; i < n - 1; i++) { 
    printf("\nOUTER\n"); 
    j1 += 1; 
    printf("i: %zu\n", i); 
    printf("j1: %i\n", j1); 

    for (j = j1; j >= j0; j--) { 
     printf("\nINNER\n"); 
     printf("j: %i\n", j); 
     printf("j1: %i\n", j1); 
     printf("j0: %i\n", j0); 

     // print first 5 elements of my aux_arr 
     for (int i = 0; i < 5; i++) { 
      printf("%f\n", aux_arr[i]); 
     } 

     aux_arr[j] = (j/m) * (aux_arr[j]) + (1 + (1/m) - (j/m)) * (aux_arr[j - 1]); 


     if (aux_arr[j] < (1.0 * pow(10, -20))) { 
      aux_arr = 0; 
      if (j == j1) { 
       j1 -= -1; 
      } 
      if (j == j0) { 
       j0 += 1; 
      } 
     } 
    } 
} 

输出如下:

OUTER 
i: 0 
j1: 2 

INNER 
j: 2 
j1: 2 
j0: 1 
0.000000 
1.000000 
0.000000 
0.000000 
0.000000 

INNER 
j: 1 
j1: 2 
j0: 1 
0.000000 
1.000000 
1.000000 
0.000000 
0.000000 

OUTER 
i: 1 
j1: 3 

INNER 
j: 3 
j1: 3 
j0: 2 
Segmentation fault: 11 

你可以看到,问题就来了,当我尝试访问我aux_arr第三次。我不知道为什么它前两次罚款。

谢谢!

+0

你是否在调试器中逐步了解代码?这是第一件事。 – OldProgrammer

+1

您可以将您的示例代码展开到[完整程序](https://*.com/help/mcve)中,我们可以复制并粘贴,编译和运行? –

+0

令人困惑的是,您在外循环中使用'i'作为迭代变量,并在循环中打印前5个元素。 – Barmar

aux_arr = 0; 

这是你的罪魁祸首。您正在将aux_array设置为空指针,因此下一次访问无效。

+0

Well spotted :-)也许'aux_arr [j] = 0'的意思是 – 4386427

+0

确实它应该是'aux_arr [j] = 0'。非常简单,但我只是看不到它。 – Davigor