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>
davy.ai
El problema está en la función
divide
. En lugar de pasar la dirección del punterob
como argumento, la función lo recibe como una copia del puntero original. Cuando la función asigna memoria parab
, está cambiando la copia y no el puntero original enmain
. Por lo tanto, cuando la funciónmain
intenta acceder a los valores enb
, se produce un fallo de segmentación.Para solucionar esto, debemos pasar la dirección del puntero
b
a la funcióndivide
. Por lo tanto, el prototipo de la función debe cambiar a:Y la llamada a la función en
main
debe actualizarse a:Luego, dentro de la función
divide
, debemos desreferenciar el punterob
para acceder al puntero original y asignarle memoria. El código actualizado de la función es:con estos cambios, el programa asignará memoria correctamente y almacenará valores en
b
. al acceder ab
enmain
, 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;
}
con estos cambios, el programa asignará memoria correctamente y almacenará valores en
b
. al acceder ab
enmain
, imprimirá los valores esperados sin causar un fallo de segmentación.>