2017-10-04 5 views
0

Je travaille avec un algorithme statistique et je continue de recevoir une erreur de segmentation, et je ne la vois tout simplement pas. Je suis à peu près sûr que j'ai calloc'd la mémoire correctement. Je me demande si cela a peut-être quelque chose à voir avec le débordement, car je ne reçois la faute qu'après quelques itérations de la boucle. Le code est ci-dessous, avec mes printf pour le débogage. Désolé si la syntaxe est un peu confuse ici, je suis à côté d'une publication de journal.Erreur de segmentation inattendue fonctionnant avec de petits nombres dans un algorithme

// *** 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; 
      } 
     } 
    } 
} 

produit les éléments suivants:

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 

Vous pouvez voir que le problème vient lorsque je tente d'accéder à mon aux_arr pour la troisième fois. Je ne sais pas pourquoi cela fonctionne bien les deux premières fois cependant.

Merci!

+0

Avez-vous parcouru le code dans un débogueur? C'est la première chose à faire. – OldProgrammer

+1

Pourriez-vous développer votre exemple de code dans un [programme complet] (https://stackoverflow.com/help/mcve) que nous pouvons copier et coller, compiler et exécuter? –

+0

Il est déroutant que vous utilisiez 'i' comme variable d'itération dans la boucle externe et la boucle pour imprimer les 5 premiers éléments. – Barmar

Répondre

2
aux_arr = 0; 

C'est votre coupable. Vous définissez aux_array pour être le pointeur null et l'accès suivant est par conséquent non valide.

+0

Bien repéré :-) Peut-être 'aux_arr [j] = 0' était destiné – 4386427

+0

En effet, il était supposé être' aux_arr [j] = 0'. Très simple et pourtant je ne pouvais tout simplement pas le voir. – Davigor