Resumen: malloc.c: 3074 - ¿Por qué este código hace que el error [cerrar]
-
13-09-2019 - |
Pregunta
La adjunta a continuación código C cuando se ejecuta da el error
summary: malloc.c:3074: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
En cada ningún cada llamada a malloc (21); (Vea abajo). Por favor alguien puede explicar por qué ?? He intentado todas las posibles que puedo imaginar y no lo consigo.
Archivo: summary.c
/*
* File: summary.c
* Author: Maxim Veksler
*
* Created on December 4, 2009, 3:09 AM
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "manipulation.h"
/*
* Main for Maman 12, task 1 : Array summary utility
*/
int main(int argc, char** argv) {
/*STUB*/
char str[100];
strcpy(str, "3 5 234 11 77 44 5");
/*STUB*/
int resultsSize;
int* results;
int* aggregated;
results = parseInput(str, &resultsSize);
aggregatedArray((int*)NULL, (int)NULL);
return 0;
}
manipulation.c Archivo
/*
* File: manipulation.c
* Author: Maxim Veksler
*
* Created on December 4, 2009, 3:09 AM
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
/*
* Parse the input from user, dynamically allocate memory to the maximum
* possible requirment. Then convert the array of string tokens into an
* simple array of integers.
*/
int* parseInput(char* input, int* nOfResults) {
/* Allocate memory by the maximum possibly required size for int... */
int *results = (int*) malloc(strlen(input));
int* insertIterator = results;
char* pch;
/* We trash the user input, but it's cool - Worthless as usual. */
pch = strtok(input,"\t ,.-");
*nOfResults = 0;
while(pch != NULL) {
(*nOfResults)++;
*insertIterator = atoi(pch);
insertIterator++;
pch = strtok(NULL, "\t ,.-");
}
return results;
}
/*
* Summary the values given in the int array and return adress to new array
* containing an increasin sum of the values.
*/
int* aggregatedArray(int* inputArray, int size) {
int* results;
malloc(20);
malloc(21);
}
Editar Por favor, tome en cuenta que este código es una versión simplificada que se trae aquí muestran el problema. He eliminado todas las partes no pertinentes.
Solución
EDIT: Woah, me acabo de dar cuenta de que tiene un error de lógica bastante malo en el código. Esto no es sólo una fuga, que tiene un desbordamiento de memoria también!
int *results = (int*) malloc(strlen(input));
Eso le asigne 18 bytes (el lengh de entrada) y el tratamiento que al igual que una amplia gama de de int
, lo que significa que puede caber 18 / sizeof(int)
s int
en ella. asumiendo que el tamaño habitual x 86, que significa que sólo puede caber (18/4) == 4,5 enteros! Más tarde su código escribirá varios más que eso en la matriz. gran error.
Para solucionar el problema, usted debe estar usando realloc
. Algo como esto:
int *results = malloc(sizeof(int));
int result_size = 1;
int result_count = 0;
while(/*whatever*/) {
/* ok, i want to add an element to results */
if(result_count == result_size - 1) {
int *p = realloc(results, (result_size + 1) * sizeof(int));
if(!p) {
free(results);
return NULL; /* no more memory! */
}
results = p;
result_size++;
}
results[result_count++] = /*value*/
}
return results;
se escapa porque tiene 2 malloc
s que no almacenan el resultado de cualquier lugar. Esto hace que sea imposible free
el puntero esas llamadas devuelven.
De hecho, no estoy seguro de lo que aggregatedArray
se supone que es realmente hacer, por el momento, no hace nada y fuga.
Además, se ha results = parseInput(str, &resultsSize);
donde parseInput
devuelve un puntero malloc
ed. Usted debe tener una free(results);
más adelante, cuando ya no es necesario este (probablemente justo después de la llamada aggregatedArray
).
Por último, como nota al margen. Me imagino que aggregatedArray((int*)NULL, (int)NULL);
debe ser, de hecho :-P aggregatedArray(results, resultsSize);
.
Otros consejos
La siguiente instrucción asigna una memoria de 18 bytes ( "3 5 234 11 77 44 5")
int *results = (int*) malloc(strlen(input));
pero se está poniendo números enteros en esa área de memoria ... por lo que no durará mucho tiempo cuando usted tendría usedup todo el espacio ... así que eso es definitivamente incorrecta de hacer.
más .. no está utilizando cualquier conexión () llama .. por lo que sería un problema demasiado ..
En la función "aggregatedArray" usted no está asignando los punteros regresaron de malloc a una variable para que puedan ser liberados más tarde. Están perdidos en el espacio!