Ajout d’une valeur à la fin d’un tableau dynamic

En fait, j’ai étudié un peu C pendant les vacances d’hiver et, au cours de mes aventures, j’ai trébuché sur un problème avec un Dynamic Array.

C’est un programme assez simple, vraiment. Ce que j’essaie de faire est de créer un tableau contenant les numéros de la série de Fibonacci. Voici le code:

#include  #include  int dynamic_arry_append(int* arry, int* number, int* size); int main() { int i, n, size = 3, *arry = NULL, fibarr[size]; printf("Dynamic array, Fibonacci series. \n"); printf("Capture upto element: "); scanf("%d", &n); i = 0; // passing the first elements fibarr[0] = 0; fibarr[1] = 1; fibarr[2] = 1; while ( i < n ) { printf("**%d\n",fibarr[0]); dynamic_arry_append( arry, &fibarr[0], &size ); fibarr[0] = fibarr[1]; fibarr[1] = fibarr[2]; fibarr[2] = fibarr[1] + fibarr[0]; i++; } for ( i = 0 ; i < size ; i++) printf("Element %d of the array: %d.\n", i, arry[i]); return 0; } int dynamic_arry_append(int* arry, int* number, int* size) { int i; int bacon = *size; // first name i thought of bacon++; int *new_addr = realloc(arry, bacon * sizeof(int)); if( new_addr != NULL ) { arry = new_addr; arry[bacon-1] = *number; // printf for easier debugging, or so i thought for ( i = 0 ; i < bacon ; i++ ) printf("%d\t%d\n", i+1, arry[i]); printf("\n"); *size = bacon; } else { printf("Error (re)allocating memory."); exit (1); } return 0; } 

Au moins dans mon esprit cela fonctionne. Cependant, dans la pratique, j’obtiens des résultats amusants:

 Dynamic array, Fibonacci series. Capture upto element: 5 **0 // next fibonacci number 1 5256368 2 5246872 3 1176530273 4 0 **1 1 5256368 2 5246872 3 1768053847 4 977484654 5 1 **1 1 5256368 2 5246872 3 1551066476 4 1919117645 5 1718580079 6 1 **2 1 5256368 2 5246872 3 977484645 4 1852397404 5 1937207140 6 1937339228 7 2 **3 1 5256368 2 5246872 3 1551071087 4 1953724755 5 842231141 6 1700943708 7 977484653 8 3 /* Code::Blocks output */ Process returned -1073741819 (0xC0000005) execution time : 17.886 s Press any key to continue. 

Je suis vraiment dérouté par cette erreur, et après avoir cherché partout, je n’ai trouvé aucune solution … Quelqu’un peut-il m’aider? Merci beaucoup.

 #include  #include  int * dynamic_array_append(int * array, int size); int main() { int i, n, size=0, *array = NULL; printf("Dynamic array, Fibonacci series. \n"); printf("Capture upto element: "); scanf("%d", &n); for (i=0 ; i 

Points à noter:

  • Le tableau nouvellement (re) alloué doit être renvoyé à main et stocké dans un pointer-to-int (ou) passer pointer-to-pointer-to-int et le mettre à jour en conséquence une fois après la réaffectation.
  • Le fibarr n'est pas nécessaire. Cela ne résout aucun problème.
  • Vous n'avez pas à passer la size et le number . Il suffit d’envoyer la size et il choisira les n-1 et n-2 pour calculer n .
  • Ceci est considéré comme highly inefficient . Parce que si vous connaissez le n vous pouvez allouer de la mémoire pour n entiers en une fois et calculer la série fib.

Le problème peut être que la variable pointeur arry est passée valeur par valeur à la fonction dynamic_arry_append . Cela signifie que les modifications que vous apportez à la variable arry au sein de cette fonction ne seront reflétées par aucune variable en dehors de cette fonction. Par exemple:

 int *a = NULL; someFunc(a); // a will still be NULL here no matter what someFunc does to it. 

Vous devez déclarer votre fibarr comme un pointeur (donc fibarr le différemment) et non comme un tableau. Et vous devriez passer à votre dynamic_arry_append l’adresse de ce pointeur, comme &fibarr . Et vous devriez initialiser fibarr dans votre main avec calloc . Enfin, vous devez mettre à jour de manière dynamic (et conserver et transmettre) la taille du tableau alloué.

Vous ne retournez pas la nouvelle adresse du tableau … et vous ne lisez / écrivez pas votre mémoire. Exécutez le programme avec tous les messages d’erreur sous le débogueur et vous verrez que le problème se trouve dans cette ligne:

  dynamic_arry_append( arry, &fibarr[0], &size );