Changer la taille du tableau dynamic 2D en C

Je crée un tableau dynamic 2D:

a = (int**)calloc(n-1, sizeof(int)); for(i = 0; i < (n-1); i++) a[i] = (int*)calloc(n, sizeof(int)); 

Ensuite, je dois changer sa taille (append une nouvelle ligne):

 a = (int**)realloc(a, n); a[n] = (int*)calloc(n, sizeof(int)); 

Mais quand je veux imprimer mon tableau,

 void Print(void){ int i, j; for(i = 0; i < (n-1); i++){ for(j = 0; j < n; j++){ printf("%d\t", arr[i][j]); } printf("\n"); } } 

j’ai violation d’access. La première ligne est imprimée … Que dois-je faire?

 a = (int**)realloc(a, (n + 1) * sizeof(int *)); n++; 

Allouer le tableau:

 int **a; ing **tmp; size_t i; a = calloc(n-1, sizeof *a); // type of a==int **, type of *a==int * if (a) { for (i = 0; i < n-1; i++) { a[i] = calloc(n, sizeof *a[i]); // type of a[i]==int *, type of *a[i]==int } } 

Redimensionner le tableau:

 /** * Assign result of realloc to a temporary variable; if realloc fails it will * return NULL, which would cause us to lose our pointer in the event of * a failure. */ tmp = realloc(a, sizeof *a * n); if (!tmp) { // realloc failed; handle error or exit } else { a = tmp; a[n-1] = calloc(n, sizeof *a[n-1]); } 

Choses à noter:

  1. À partir de C89, vous n'avez pas besoin de calloc() le résultat de malloc() , calloc() ou realloc() , ce qui peut supprimer un avertissement potentiellement utile. si rien d'autre, cela rend le code plus facile à lire.
  2. Utilisez l'opérateur sizeof sur l'object, pas le type; cela réduit un peu le code, et vous n'avez pas à revenir en arrière et mettre à jour tous vos appels malloc / calloc / realloc si vous changez le type de a.
  3. Si vous avez n éléments dans le tableau, l'index du dernier élément sera n-1 .

Dans ce code:

 a = (int**)realloc(a, n); a[n] = (int*)calloc(n, sizeof(int)); 

vous accédez à la (n + 1) ème position du tableau. Vous devriez écrire:

 a = (int**)realloc(a, n * sizeof(int*)); a[n-1] = (int*)calloc(n, sizeof(int));