Devolviendo una matriz desde una función en C: Error de segmentación

Estoy tratando de implementar un progtwig simple utilizando un archivo de encabezado donde una función en el archivo de encabezado acepta una matriz int y también devuelve una matriz 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; } 

prueba.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]); } } 

Tengo un error de segmentación en el bucle de impresión en test.c

¿Alguien puede ayudar?

El problema tiene que ver con el scope de la variable de array que está devolviendo en su método. En este momento está devolviendo una array , una variable local definida en el método, point . Sin embargo, una vez que se termina de ejecutar el point , todas las variables locales dentro del marco de la función, incluida la array , se descartarán de la memoria principal. Así que, aunque todavía tenga una dirección de memoria desde un point , no se sabe qué podría haber en esa dirección de memoria. Por lo tanto, tratar la array como una matriz int cuando se imprimen sus elementos llevará a una falla de segmentación.

Mi sugerencia para solucionar esto es asignar memoria del montón usando malloc para que la array dure fuera del marco del point . La solución debería verse así.

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

No puede devolver matrices desde funciones. Cuando el point() regresa, la matriz local dentro de esta función queda fuera del scope. Esta matriz se crea en la stack y se destruirá una vez que la función termine de regresar. Toda la memoria asociada con ella se descarta, y el puntero devuelto apunta a una posición en la stack que ya no existe. En su lugar, debe asignar un puntero en el montón y devolverlo en su lugar. Esto permite compartir la array a través de su progtwig.

En lugar de:

 int array[4]; 

necesitas asignar dinámicamente un puntero usando malloc() :

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

malloc() asigna la memoria solicitada en el montón, y le devuelve un puntero void* .

Nota: malloc() puede devolver NULL cuando no tenga éxito, por lo que debe verificarse siempre. También debe free() cualquier memoria asignada previamente por malloc() . Tampoco es necesario emitir devolución de malloc () .

Otra cosa a destacar es usar el número mágico 4 todo el progtwig. Esto debería calcularse realmente utilizando sizeof(a)/sizeof(a[0]) .

Puede declarar esto como una variable size_t en su main() :

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

O puedes usar una macro:

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

Y simplemente llame a ARRAYSIZE(a) cada vez que desee el tamaño de la matriz.

Puede definir la matriz [] como una variable global, o asignar dinámicamente memoria para ella como se menciona en los comentarios anteriores usando malloc (). Como la matriz [] está asignada en el punto de función (), se elimina una vez que la función sale. Por lo tanto, una referencia al puntero devuelto provoca un fallo de segmentación.