Renvoi d’un tableau à partir d’une fonction dans C: erreur de segmentation

J’essaye d’implémenter un programme simple en utilisant un fichier d’en-tête où une fonction du fichier d’en-tête accepte un tableau int et renvoie un tableau int

header.h

int* point(int a[]); 

header.c

 #include #include "header.h" int* point(int a[]) { printf("In the point function\n"); int array[4],i; for(int i=0;i<4;i++) { printf("%dth Iteration\n",i); array[i]=a[i]; } return array; } 

test.c

 #include #include "header.h" void main() { int *array,i; int a[]={1,2,3,4}; printf("calling point function\n"); array=point(a); printf("Back in the main function\n"); for(i=0;i<4;i++) { //SEGMENTATION FAULT HERE printf("%d\n",array[i]); } } 

Je reçois une erreur de segmentation au niveau de la boucle d’impression dans test.c

Quelqu’un peut-il aider?

Le problème concerne la scope de la variable de array que vous renvoyez dans votre méthode. À l’heure actuelle, vous retournez un array , une variable locale définie dans la méthode, point . Cependant, une fois que le point est terminé, toutes les variables locales dans le cadre de la fonction, y compris le array seront ignorées de la mémoire principale. Ainsi, même si vous obtenez toujours une adresse mémoire à partir d’un point , vous ne pouvez pas savoir ce qui pourrait être à cette adresse mémoire. Par conséquent, traiter un array comme un tableau int lors de l’impression de ses éléments entraînera une erreur de segmentation.

Ma suggestion pour résoudre ce problème consiste à allouer de la mémoire à partir du tas à l’aide de malloc afin que le array dure en dehors du cadre de point . La solution devrait ressembler à ceci,

 int* point(int a[]) { printf("In the point function\n"); int *array = (int *) malloc(4 * sizeof(int)); //dynamically allocate memory for 4 integers int i; for(i=0;i<4;i++) { printf("%dth Iteration\n",i); array[i]=a[i]; } return array; } 

Vous ne pouvez pas retourner de tableaux à partir de fonctions. Lorsque point() renvoyé, le tableau local de cette fonction sort de la scope. Ce tableau est créé sur la stack et sera détruit une fois la fonction retournée. Toute la mémoire qui lui est associée est supprimée et le pointeur renvoyé pointe vers une position de la stack qui n’existe plus. Vous devez au lieu de cela allouer un pointeur sur le tas et le renvoyer à la place. Cela permet au array d’être partagé dans votre programme.

Au lieu de:

 int array[4]; 

vous devez allouer dynamicment un pointeur à l’aide de malloc() :

 int *array = malloc(4 * sizeof(*array)); /* or sizeof(int) */ if (array == NULL) { /* handle exit */ } 

malloc() alloue la mémoire demandée sur le segment de mémoire et lui renvoie un pointeur void* .

Remarque: malloc() peut renvoyer NULL cas d’échec; elle doit donc toujours être vérifiée. Vous devez également free() mémoire allouée précédemment par malloc() . Vous n’avez également pas besoin de lancer cast return (retour) de malloc () .

Une autre chose à souligner est l’utilisation du chiffre magique 4 tout votre programme. Cela devrait vraiment être calculé en utilisant sizeof(a)/sizeof(a[0]) .

Vous pouvez déclarer cela comme une variable size_t dans votre main() :

 size_t n = sizeof(a)/sizeof(a[0]); 

Ou vous pouvez utiliser une macro:

 #define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0])) 

Et appelez simplement ARRAYSIZE(a) chaque fois que vous souhaitez ARRAYSIZE(a) la taille du tableau.

Vous pouvez définir array [] comme une variable globale ou allouer de la mémoire de manière dynamic comme indiqué dans les commentaires ci-dessus à l’aide de malloc () Puisque le tableau [] est alloué dans la fonction point (), il est supprimé une fois la fonction terminée. Par conséquent, une référence au pointeur renvoyé provoque une erreur de segmentation.