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.

¿Fue útil?

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 mallocs 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 malloced. 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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top