es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sumando dos elementos correspondientes de un arreglo y devolviendo el arreglo resultante.

Enfrentando un error de segmentación en el siguiente código. ¿Alguien puede ayudarme a arreglarlo?

#include<stdio.h>

int* multiply(int *arr1, int *arr2, int m);

int main(void){
    int m = 0;

    printf("Ingrese el tamaño de array1 y array2: ");
    scanf("%d",&m);

    int arr1[m],  arr2[m];
    printf("Primer array: ");

    for(int i = 0; i < m; ++i){
        scanf("%d", &arr1[i]);
    }
    printf("Segundo array: ");
    for(int j = 0; j < m; j++)
        scanf("%d", &arr2[j]);

    int* result = multiply(arr1, arr2, m);

    printf("El resultado: ");
    for(int i = 0; i < m; ++i){
        printf("%d ", result[i]);
    }
}

int* multiply(int *arr1, int *arr2, int m){
    int *res = malloc(sizeof(int) * m);

    for(int i = 0; i < m; ++i){
        res[i] = arr1[i] + arr2[i];
    }

    return res;
}

La salida debería mostrar:

Ingrese el tamaño de array1 y array2: 3
Primer array: 5 1 7
Segundo array: 2 4 2
El resultado: 7 5 9

Mi salida:

“`
Ingrese el tamaño de array1 y array2: 3
Primer array: 5 1 7
Segundo array: 2 4 2
Error de segmentación.</stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El código dado está causando un error de segmentación debido a las siguientes razones:

    1. La función multiply está devolviendo un puntero a una matriz local res que tiene una duración de almacenamiento automático, lo que significa que existe solo dentro del bloque de la función. Una vez que la función devuelve, la memoria asignada a res se libera, quedando un puntero no válido.
    2. La instrucción printf en la función multiply está causando un error ya que se produce un retorno antes de que se pueda imprimir el mensaje.

    Para resolver este problema, podemos asignar memoria dinámicamente utilizando malloc o calloc para la matriz res y devolver el puntero a esta memoria asignada. Además, debemos mover la instrucción printf después del bucle for que llena la matriz res, como se muestra en el código actualizado a continuación:

    #include<stdio.h>
    #include<stdlib.h>
    
    int* multiply(int *arr1, int *arr2, int m);
    
    int main(void){
        int m = 0;
    
        printf("Ingrese el tamaño de la matriz1 y la matriz2 >");
        scanf("%d",&m);
    
        int *arr1 = malloc(m * sizeof(int));
        int *arr2 = malloc(m * sizeof(int));
    
        printf("Primera matriz>");
        for(int i = 0; i < m; ++i){
            scanf("%d", &arr1[i]);
        }
    
        printf("Segunda matriz>");
        for(int j = 0; j < m; j++)
           scanf("%d", &arr2[j]);
    
        int* result = multiply(arr1, arr2, m);
    
        printf("El resultado > ");
        for(int i = 0; i < m; ++i){
            printf("%d ", result[i]);
        }
        printf("\n");
    
        free(arr1);
        free(arr2);
        free(result);
        return 0;
    }
    
    int* multiply(int *arr1, int *arr2, int m){
        int* res = malloc(m * sizeof(int));
    
        for(int i = 0; i < m; ++i){
            res[i] = arr1[i] + arr2[i];
        }
    
        printf("ok\n");
        return res;
    }
    

    En el código actualizado, utilizamos malloc para asignar memoria a las matrices arr1, arr2 y res. Después de utilizar la matriz res en la función main, debemos liberar la memoria asignada a estas matrices utilizando la instrucción free().

    Finalmente, se han modificado las instrucciones printf para mostrar la salida correcta según la tarea.

    Al ejecutar el código corregido, obtenemos la siguiente salida para la entrada dada:

    c
    Ingrese el tamaño de la matriz1 y la matriz2 >3
    Primera matriz>5 1 7
    Segunda matriz>2 4 2
    ok
    El resultado > 7 5 9
    </stdlib.h></stdio.h>

Comments are closed.