Erreur de segmentation lors de l’initialisation d’un tableau 2D

J’ai vérifié que mon code dessinait correctement l’espace mémoire, mais dès que j’essayais d’initialiser mon tableau 2D à certaines valeurs, puis de les résumer, je recevais une erreur de segmentation sur un tableau 2×2 seulement. J’aimerais éventuellement adapter mon code à un plus grand nombre, mais je ne peux même pas le faire fonctionner ici. Je sais qu’il existe de nombreux articles sur la défaillance de segmentation concernant les tableaux malloc et 2D, mais je suis incapable d’en trouver un qui m’aide à résoudre mes problèmes, car ma connaissance du C ne fait que commencer. Toute aide que vous pouvez donner ou si vous pouvez me diriger vers une question précédente serait grandement appréciée. Je vous remercie!

#include  #include  #include  int main() { double sum=0; int i,j; int N = 2; double **array; array = malloc(N * sizeof(double *)); if(array == NULL) printf("Failure to allocate memory.\n"); for(i=0; i<=N; i++) { array[i] = malloc(N * sizeof(double)); if(array[i] == NULL) { printf("Failed to allocate memory for arr[%d].\n", i); exit(0); } } for(i=0; i<=N; i++) { for(j=0; j<=N; j++) { array[i][j] = 1.0/(i+j); sum = sum + array[i][j]; } } return(0); } 

Vous avez été victime de l’une des gaffes classiques: utiliser <= au lieu de < .

 for(i=0; i<=N; i++) 

Cela initialisera array [0], array [1], et le plus important array [2] (car 2 <= 2), mais vous n'avez pas d'espace malloc pour trois pointeurs, seulement deux.

Voici ce que vous voulez:

 for(i=0; i 

Il va parcourir tableau [0] et tableau [1] (pour un total de deux entrées).

(Ne dites pas que vous n'avez pas d'autres bugs, mais c'est certainement l'un d'entre eux.)

Vous allouez de l’espace à un tableau NxN, mais dans vos cycles, vous essayez d’accéder à un tableau (N + 1) par (N + 1). Vous pouvez remplacer vos cycles par l’un des suivants:

 for(i=0; i 

ou

 for(i=1; i<=N; i++) 

Étant donné que vous calculez 1.0 / (i + j) , vous pouvez utiliser le second, car le premier produira une division par zéro lorsque i = 0, j = 0. Mais attention, si vous utilisez la deuxième option, vous devez décaler vos index de 1, comme ceci: array [i-1] [j-1] , car ils commenceront toujours à 0. Il vaut mieux utiliser la première option.