ayer, durante el tiempo de programación que todo estaba bien, pero hoy me extraño error. No sé por qué, pero después de ejecutar mis programas, en la terminal me sale este error «abortado (colapsaba)», también puedo ejecutar los programas que ya están hechas y el problema es el mismo.
Ejemplo de programa:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define CHUNK 12
char *getWord(FILE *infile);
int main(int argc, char *argv[])
{
char *word;
FILE *infile, *outfile;
int n = 0;
if(argc != 2) 
{
printf("Error! Type:./file_name input_file output_file\n");
abort();
}
infile = fopen(argv[1], "r");
if(infile != NULL)
{
outfile = fopen(argv[2], "w");
if(outfile == NULL)
{
printf("Error! Cannot open the output_file\n");
abort();
}
else
{
while(!feof(infile))
{
word = getWord(infile);
if(word == NULL)
{
free(word);
abort();
}
n++;
if(n % 2 == 0)
{
fputs(word, outfile);
fputs(" ", outfile);
}
else 
{
fputs(word, outfile);
fputs("(", outfile);
fputs(word, outfile);
fputs(")", outfile);
fputs(" ", outfile);
}
free(word);
}
}
}
else
{
printf("Error! Cannot open the input_file\n");
abort();
}
fclose(infile);
fclose(outfile);
return 0;
}
char *getWord(FILE *infile)
{
char *word, *word2;
int length, cursor, c;
word = malloc(sizeof(char)*CHUNK);
if(word == NULL)
{
return NULL;
}
length = CHUNK;
cursor = 0;
while(isalpha(c = getc(infile)) && !feof(infile))
{
word[cursor] = c;
cursor++;
if(cursor >= length)
{
length += CHUNK;
word2 = realloc(word, length*sizeof(char));
if(word2 == NULL)
{
free(word2);
return NULL;
}
else word2 = word;
}
}
ungetc(c, infile);
word[cursor] = '\0';
return word;
}

y el error:

Error! Type:./file_name input_file output_file
Aborted (core dumped)
  • 1) argc 2) !feof()
  • uso valgrind herramienta para diagnosticar este tipo de errores.
  • if(word == NULL) { free(word); tikes.
InformationsquelleAutor all0star | 2013-08-29

2 Comentarios

  1. 3

    Si el comando requiere de 2 parámetros, es necesario comprobar para argc != 3 desde el nombre del comando en sí es considerada como un argumento. Si usted está dando de 2 parámetros, haga su cheque en argc != 2 está fallando y que están recibiendo su mensaje de error, y el volcado de núcleo debido a la abort llamada.

    Lugar de abort, usted debe llamar a exit con un no-cero de parámetros. E. g.,

    if(argc != 3) 
    {
    printf("Error! Type: %s input_file output_file\n", argv[0]);
    exit(1);
    }
    • mejor aún, utilice argv[0] para el nombre del programa
    • sí, de hecho. Gracias.
  2. 4

    La lógica en su realloc está mal.

    word2 = realloc(word, length*sizeof(char));
    if(word2 == NULL)
    {
    free(word2);
    return NULL;
    }
    else word2 = word;

    debe ser

    word2 = realloc(word, cursor);
    if(word2 == NULL)
    {
    free(word);
    return NULL;
    }
    word = word2;

    Hay algunos cambios aquí

    • word comienza a tener length bytes asignados así que no hay ningún punto en la reasignación es del mismo tamaño. La variable que realiza el seguimiento de tamaño de la cadena es cursor así que usted necesidad de reasignar para que coincida con su tamaño.
    • (menor de edad), no es necesario el uso de sizeof(char) para ayudar a calcular el tamaño de una distribución – esto está garantizado para ser 1
    • Si realloc falla, deberá free el puntero original, no uno nuevo (que como saben, es NULL).
    • Si la reasignación se realiza correctamente, la pila de células de mayo se han movido, dejando word que apunta a la memoria que no posee. El resto de la función opera en word por lo que necesita para actualizar a punto para el nuevo búfer (word2)

    Cuanto a por qué esta funcionado anteriormente, el código anterior se traduce en un comportamiento indefinido en un número de lugares. A veces la mala suerte de que este parece funcionar correctamente.

Dejar respuesta

Please enter your comment!
Please enter your name here