Я пытаюсь сделать интерпретатор на языке программирования C, он работает хорошо, но когда я пытаюсь добавить эти две переменные в код, программа просто вылетает. К счастью, когда я добавляю ключевое слово static или оставляю переменные в программе глобальными, программа не падает. Почему это происходит? Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
//If I leave the variables here the program doesn't crash
//int esMain = 0;
//int esEnd = 0;
int main(int argc, char** argv){
FILE *f;
f = fopen(argv[1], "r+");
if (f == NULL){
perror("Error: No se encuentra el archivo\nDescripcion");
exit(1);
}
if (ferror(f)){
printf("Archivo corrupto");
exit(1);
}
printf("\nEjecutando archivo: %s\n\n\n", argv[1]);
int esMain = 0;//These two variables makes the program to crash
int esEnd = 0;
//But if I add the static keyword in both variables the program works well.
char* str;
while(1){
fgets(str, 25, f);
if (strncmp(str, "MAIN:", 5) == 0){
esMain = 1;
}
if (strncmp(str, "END.", 4) == 0){
esEnd = 1;
}
if (feof(f) != 0){
if (esMain == 0){
printf("No existe el parametro main, cierre por no tener el parametro main (poner MAIN: ENCIMA)");
exit(1);
}
if (esEnd == 0){
printf("No existe el parametro end, cierre por no tener el parametro main (poner END. ENCIMA)");
exit(1);
}
break;
}
}
rewind(f);
while(1){
fgets(str, 500, f);
if (strncmp(str, "print ", 6) == 0){
printf(str + 6);
}
if (strncmp(str, "msg", 3) == 0){
if (strstr(str + 4, "check")){
MessageBox(HWND_DESKTOP, str + 10, "Check", MB_ICONINFORMATION);
}
if (strstr(str + 4, "error")){
MessageBox(HWND_DESKTOP, str + 10, "Error", MB_ICONERROR);
}
}
if (strncmp(str, "pause", 5) == 0){
getch();
}
if (feof(f) != 0){
break;
}
}
printf("\n\n\nEND EXECUTION");
fclose(f);
return 0;
}
если вы выбираете путь динамического выделения памяти с помощью malloc
, не забудьте также free(str)
в конце программы, вы также можете захотеть привести возвращаемое значение malloc к char*
, так как по стандарту он возвращает void*
Включите предупреждения компилятора, чтобы помочь отловить эти простые ошибки.
if (feof(f) != 0){
уже поздно. Используйте while(fgets(str, 500, f)) {
printf(str + 6);
является благодатной почвой для хакерского эксплойта, поскольку printf()
сначала ожидает строку формата. Используйте printf("%s", str + 6);
Спасибо всем за ваши рекомендации <3 :), это действительно помогает мне лучше понять этот прекрасный язык.
Объявление char* str;
, вероятно, нарушает ваш код. Когда вы объявляете его глобальным, он хранится в другом месте в памяти, чем если бы вы объявляли его внутри функции.
Вам повезло, что ваша программа работает с ним как с глобальной переменной. Поскольку вы не зарезервировали место в памяти, переменная обращается к некоторой памяти, которой не должна (неопределенное поведение). Удачливый может быть не лучшим словом для описания, потому что из-за его неопределенного поведения вы можете подумать, что ваша программа работает правильно, а это не так (если бы она потерпела крах, вы были бы на 100% уверены, что были ошибки).
Что вы можете сделать, чтобы исправить это, является одним из следующих:
выделить его динамически: char *str = (char*)malloc(sizeof(char)*25);
измените его на br массив: char str[25];
указать на существующий массив: char arr[25]; char *str = arr;
В ролях не нужно. Примите во внимание str = malloc(sizeof *str * 25)
, чтобы избежать несоответствия типа.
Честно говоря, мой компилятор не дал никаких ошибок. Я использую GCC (MinGW).
char* str;
Это неинициализированный указатель, который никуда конкретно не указывает, ноfgets(str, 25, f);
пытается писать в него, что является неопределённым поведением. Сделайте так, чтобыstr
указывал на допустимый строковый буфер перед его использованием, напримерchar str[25];
илиchar *str = malloc(25);
.