Partage
  • Partager sur Facebook
  • Partager sur Twitter

free() : invalid pointer

    13 juin 2022 à 17:48:18

    bonjour je suis un developper débutant et j'ai commencer à écrire un interpreteur pour le language brainfuck mais je me suis heurté à un problème.

    cela fait plusieur jour que je suis bloqué à cause d'une érreur : free() : invalid pointer

    cette erreur ne se manifeste pas à la compilation mais durant l'éxécution.

    j'tuilise la commande : "./main 2 main.brainfuck 11" pour l'éxécuter

    j'espert que quelqun pourrat m'aider.

    merci d'avance.

    le code :

    main.c :

    #include <stdio.h>
    #include <stdlib.h>
    #include "utils.h"
    
    int main(int argc, char** argv) {
    	//be sure that the program is called properly
    	if(argc < 3) {
    		//if then print how to use the program
    		printf("Usage : main <array_size> <brainfuck_file.brainfuck>\n");
    		return 1;
    	}
    	//else begin by getting the code from the file
    	printf("test1");
    	char* code = FileToString(atoi(argv[3]), argv[2]);
    	//then execute the program
    	execute(atoi(argv[1]), code, atoi(argv[3])) ? printf("\n") : printf("an error occured");
    	//finally free the code pointer and return the program
    	free(code);
    	return 0;
    }

    utils.h :

    #ifndef UTILS_H
    #define UTILS_H
    
    typedef unsigned char BYTE;
    
    char* FileToString(int size, char* fileName);
    
    int execute(int arraySize, char* code, int codeSize);
    
    #endif

    utils.c :

    #include <stdio.h>
    #include <stdlib.h>
    #include "utils.h"
    
    char* FileToString(int size, char* fileName) {
        char* code = (char*)malloc(size * sizeof(char));
        //open the file
        FILE* file = fopen(fileName, "r");
        //get the file content
        fgets(code, size, file);
        printf("test2");
        //close the file
        fclose(file);
        //returning the code and adding the \0 escape code to be sure that the program stop at the end
        return code;
    }
    
    int execute(int arraySize, char* code, int codeSize) {
        //first create the pointer array for the program
        BYTE* programArray = (BYTE *)malloc(arraySize * sizeof(BYTE));
        //for loop to run throught the brainfuck program
        for (int i = 0; i < codeSize; i++)
        {
            //temporary character variable to be sure we dont execute more than 1 char at a time
            char c = code[i];
            //switch statement on the character to know what to execute
            switch(c) {
                //increase memory pointer
                case '>':
                    programArray++;
                    break;
                //decrease memory pointer
                case '<':
                    programArray--;
                    break;
                //increment the value at pointer current address
                case '+':
                    *programArray++;
                    break;
                //decrement the value at pointer current address
                case '-':
                    *programArray--;
                    break;
                //get a character from the user
                case ',':
                    *programArray = getchar();
                    break;
                //output the character at the pointer
                case '.':
                    putchar((char)*programArray);
                    break;
                //default take at a comment
                default:
                    break;
            }
        }
        printf("test");
        free(programArray);
        return 1;
    }

    main.brainfuck :

    ++++>++.<.

    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2022 à 18:06:11

      Que vaut le 3ième paramètre? Je pense que tu ne réserves pas assez de mémoire.
          char* code = FileToString(atoi(argv[3]), argv[2]);
          char* code = (char*)malloc(size * sizeof(char));

      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        13 juin 2022 à 18:09:35

        Ce qu'il faut passer à "free" c'est un pointeur précédemment alloué avec "malloc", ou "calloc" ou autre. Le problème est que tu passes à free une valeur modifiée de "programArray", il faut lui passer le pointeur original pour qu'il puisse le libérer.
        • Partager sur Facebook
        • Partager sur Twitter
          14 juin 2022 à 0:45:18

          merci j'ai enfin réussit à régler mon problème en creeant un pointer nommé to free pointer sur lequel je ne faisait pas de modif (si vous avez une solution plus opti vous pouvez me le dire)

          -
          Edité par TidianDelage1 14 juin 2022 à 0:47:02

          • Partager sur Facebook
          • Partager sur Twitter

          free() : invalid pointer

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown