Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

325
Vistas
C: no se asignó el puntero de error malloc que se está liberando

Estoy tratando de devolver una matriz de cadenas de una función y luego liberar la memoria que usó. El código está abajo:

 int main(int argc, const char * argv[]) { for (int m = 0; m < 10000; m++) { char **data = dataTest(); int i = 0; while(data[i]) { printf("%p ",data[i]); free(data[i]); i++; } printf(" address= %p.\n",data); free(data); } return 0; }

Aquí está la función:

 char **dataTest() { char *row[] = {"this", "is", "a", "data", "string", NULL}; char **str = row; char **dataReturn = (char **) malloc(sizeof(char *) * 6); int i = 0; while (*str) { dataReturn[i] = malloc(sizeof(char) * strlen(*str)); strcpy(dataReturn[i++], *str); str++; } return dataReturn; }

Funciona bien al principio, pero pronto se produce el error. A continuación se muestra el resultado. La dirección sale mal de alguna manera y ocurre el error malloc. ¿Alguien se ha encontrado con el mismo problema antes?

0x100300030 0x100300040 0x100300050 0x100300060 0x100300070 dirección = 0x100300000.
0x100300030 0x100300040 0x100300050 0x100300060 0x100300070 dirección = 0x100300000.
0x100400030 0x100300030 0x100300040 0x100300050 0x100300060 dirección = 0x100400000.
testC(562,0x7fff73e71310) malloc: *** error para el objeto 0x3000000000000:     
el puntero que se está liberando no se asignó
*** establece un punto de interrupción en malloc_error_break para depurar
0x100300060 0x100300070 0x100300030 0x100300040 0x100300050 0x3000000000000                 
Programa finalizado con código de salida: 9
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Debe agregar esto justo antes de return dataReturn; en su función de dataTest de datos:

 dataReturn[i] = NULL ;

de lo contrario, su while (data[i]) {} continuará más allá de lo deseado.

Y en lugar de:

 dataReturn[i] = malloc( sizeof(char) * (strlen(*str)) );

escribe:

 dataReturn[i] = malloc(strlen(*str) + 1);

con el fin de asignar espacio para el cero de terminación.

Por cierto, el tamaño de sizeof (char) es siempre 1.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda