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.

Obtenemos un “segmentation fault” al manipular malloc en C.

Estoy implementando un programa para dividir todos los valores en el array “a” por 100 y luego almacenarlos en el array “b” utilizando “malloc”. El problema es que obtengo un “segmentation fault” cuando imprimo el valor de “b” en “main”.

Este es mi código:

#include <stdio.h>
#include <stdlib.h>

void divide(int *a, int n, double *b){
    b=malloc(n*sizeof(double));

    for(int i=0; i<n; i++){
        b[i]=(double)a[i]/100.0;
    }

    // comprobación: los valores todavía están en b
    for (size_t i = 0; i < 5; i++)
    {
        printf("%.2f ", b[i]);
    }
}

int main(){
    int a[]={1,2,3,4,5};
    double *b;

    divide(a,5,b);

    // comprobación: se pierde el valor y causa el segmentation fault
    for (size_t i = 0; i < 5; i++)
    {
        printf("%.2f ", b[i]);
    }
    free(b);
    return 0;
}

entonces, ¿qué causa este problema y cómo puedo solucionarlo?

gracias de antemano. i++){=”” b[i]=”(double)a[i]/100.0;” }=”” comprobación:=”” los=”” valores=”” todavía=”” están=”” en=”” b=”” for=”” (size_t=”” i=”0;” i=”” <=”” 5;=”” i++)=”” {=”” printf(“%.2f=”” “,=”” b[i]);=”” }=”” }=”” int=”” main(){=”” int=”” a[]=”{1,2,3,4,5};” double=”” *b;=”” divide(a,5,b);=”” comprobación:=”” se=”” pierde=”” el=”” valor=”” y=”” causa=”” el=”” segmentation=”” fault=”” for=”” (size_t=”” i=”0;” i=”” <=”” 5;=”” i++)=”” {=”” printf(“%.2f=”” “,=”” b[i]);=”” }=”” free(b);=”” return=”” 0;=”” }=”” “`=”” entonces,=”” ¿qué=”” causa=”” este=”” problema=”” y=”” cómo=”” puedo=”” solucionarlo?=”” gracias=”” de=””></n; i++){
b[i]=(double)a[i]/100.0;
}

// comprobación: los valores todavía están en b
for (size_t i = 0; i < 5; i++)
{
    printf("%.2f ", b[i]);
}

}

int main(){
int a[]={1,2,3,4,5};
double *b;

divide(a,5,b);

// comprobación: se pierde el valor y causa el segmentation fault
for (size_t i = 0; i < 5; i++)
{
    printf("%.2f ", b[i]);
}
free(b);
return 0;

}
“`

entonces, ¿qué causa este problema y cómo puedo solucionarlo?

gracias de antemano.></stdlib.h></stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema está en la función divide. En lugar de pasar la dirección del puntero b como argumento, la función lo recibe como una copia del puntero original. Cuando la función asigna memoria para b, está cambiando la copia y no el puntero original en main. Por lo tanto, cuando la función main intenta acceder a los valores en b, se produce un fallo de segmentación.

    Para solucionar esto, debemos pasar la dirección del puntero b a la función divide. Por lo tanto, el prototipo de la función debe cambiar a:

    void divide(int *a, int n, double **b)
    

    Y la llamada a la función en main debe actualizarse a:

    divide(a, 5, &b);
    

    Luego, dentro de la función divide, debemos desreferenciar el puntero b para acceder al puntero original y asignarle memoria. El código actualizado de la función es:

    void divide(int *a, int n, double **b){
        *b=malloc(n*sizeof(double));
    
        for(int i=0; i<n; i++){
            (*b)[i]=(double)a[i]/100.0;
        }
    
        //verificar: los valores aún permanecen en b
        for (size_t i = 0; i < 5; i++)
        {
            printf("%.2f ", (*b)[i]);
        }
    }
    

    con estos cambios, el programa asignará memoria correctamente y almacenará valores en b. al acceder a b en main, imprimirá los valores esperados sin causar un fallo de segmentación. i++){=”” (b)[i]=”(double)a[i]/100.0;” }=”” verificar:=”” los=”” valores=”” aún=”” permanecen=”” en=”” b=”” for=”” (size_t=”” i=”0;” i=”” <=”” 5;=”” i++)=”” {=”” printf(“%.2f=”” “,=”” (b)[i]);=”” }=”” }=”” con=”” estos=”” cambios,=”” el=”” programa=”” asignará=”” memoria=”” correctamente=”” y=”” almacenará=”” valores=”” en=”” b.=”” al=”” acceder=”” a=”” b=”” en=”” main,=”” imprimirá=”” los=”” valores=”” esperados=”” sin=”” causar=”” un=”” fallo=”” de=””></n; i++){
    (*b)[i]=(double)a[i]/100.0;
    }

        //verificar: los valores aún permanecen en b
        for (size_t i = 0; i < 5; i++)
        {
            printf("%.2f ", (*b)[i]);
        }
    }
    

    con estos cambios, el programa asignará memoria correctamente y almacenará valores en b. al acceder a b en main, imprimirá los valores esperados sin causar un fallo de segmentación.>

Comments are closed.