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;
}
#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;
}
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));
Le Tout est souvent plus grand que la somme de ses parties.
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.
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
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.
Le Tout est souvent plus grand que la somme de ses parties.