2016-03-17 7 views
-2

Я пытаюсь написать программу-компилятор в C (Ubuntu, gcc) с помощью учебника Джека Креншоу http://compilers.iecc.com/crenshaw/. Однако его написано на Паскале, и я относительно новичок в C, поэтому я попытался написать его как можно лучше.C - ошибка сегментации сегментации программы

Мне нужна помощь. A Ошибка сегментации. См. Вывод Valgrind:

==3525== Invalid read of size 1 
==3525== at 0x80484C0: GetChar (in /home/spandan/codes/Compiler_1) 
==3525== by 0x8048AAD: Init (in /home/spandan/codes/Compiler_1) 
==3525== by 0x8048ACD: main (in /home/spandan/codes/Compiler_1) 
==3525== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
==3525== 
==3525== 
==3525== Process terminating with default action of signal 11 (SIGSEGV) 
==3525== Access not within mapped region at address 0x0 
==3525== at 0x80484C0: GetChar (in /home/spandan/codes/Compiler_1) 
==3525== by 0x8048AAD: Init (in /home/spandan/codes/Compiler_1) 
==3525== by 0x8048ACD: main (in /home/spandan/codes/Compiler_1) 

Я отправлю часть кода, относящуюся к следствию стека Valgrind. Остальное можно найти по адресу: http://pastebin.com/KBHyRC1n.

Пожалуйста, помогите с объяснением. По моим словам, все указатели правильно используются. Я хочу предоставить ввод командной строки для этой программы, но даже если я этого не сделаю, она по-прежнему сохраняется.

#include<stdio.h> 
#include<stdlib.h> 

static char *Look; 
static int LookP = 0; 
//read new character from input stream 
char GetChar(){ 
char x; 
x= Look[LookP]; 
LookP++; 
return x; 
} 

// initializer function 
void Init(char *c){ 
Look=c; 
GetChar(); 
//SkipWhite(); 
} 

int main(int argc, char *argv){ 
Init(argv[1]); 
//Assignment(); 
if (Look[LookP] != '\r'){ 
    // Expected('Newline'); 
} 
return 0; 
} 
+0

Вы должны получить компилятор предупреждение о вызове 'Init'. Он ожидает 'char *', но 'argv [1]' является просто 'char'. – Barmar

+1

Вы также должны сообщить нам, как вы вызываете свою программу, особенно параметры командной строки. –

+0

@MichaelWalz У меня даже нет времени для ввода параметров командной строки. В окнах всплывающая консоль закрывается, прежде чем я могу, в linux это не имеет значения, я даю или не добавляю никаких параметров, это говорит о «ошибке сегментации, ядре сбрасывается». – Spandan

ответ

3

Неверная подпись main(). он должен быть int main(int argc, char **argv){ (добавьте еще * до argv)

Также перед проверкой количества аргументов командной строки вы должны проверить количество аргументов командной строки.

+0

У меня даже нет времени для ввода параметров командной строки. В окнах всплывающая консоль закрывается, прежде чем я могу, в linux, это не имеет значения, я даю или не добавляю никаких параметров, это говорит о «ошибке сегментации, сбрасывании ядра». Кроме того, я сделал так, как вы сказали 'main()', однако это не помогло. Как вы думаете, в чем причина ошибки сегментации? Я делаю что-то неправильно в 'GetChar()'? – Spandan

0

Есть много вопросов:

  • SkipWhite не определен
  • подпись main неправильно оно должно быть int main(int argc, char **argv)
  • Assignment не определен
  • Expected не определен
  • Expected('Newline'); не делает чувства, вы имели в виду Expected("Newline");?
  • argv[1] NULL, если нет аргументов командной строки, и программа, скорее всего, сбой.

Для указания аргумента командной строки при запуске программы из IDE, используйте соответствующую опцию (в Visual Studio 2015 щелкните правой кнопкой мыши на проекте в обозревателе решений, выберите Отладка и положить все, что вы хотите под «COMMANDE Аргументы ", для других IDE я не знаю).

Вы должны проверить, если количество аргументов командной строки неправильно, например:

int main(int argc, char **argv){ 
    if (argc < 2) 
    { 
    printf("argument missing\n"); 
    return 1; 
    } 
    ... 
} 
Смежные вопросы