Печать строкового литерального токена в yacc с использованием printf вызывает ошибку сегментации - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь напечатать строку с указателем на символ в Yacc, но когда я пытаюсь это вызвать ошибку seg.В файле lex это выглядит так:

\"([^"]|\\\")*\" {yylval.s = strdup(yytext); yycolumn += yyleng; return(STRINGnumber);}

И я получаю строковый литерал, который выглядит следующим образом:

//Used to store the string literal
char * s;
//To store it I call
strcpy(s, $1); //Where $1 is the string literal

Всякий раз, когда я звоню

printf("%s", s);

Это даетмне ошибка сегментации.Почему это происходит и как это можно исправить?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Ваш лексер возвращает указатель на недопустимую память 1 , содержащую строку, поэтому, вероятно, все, что вам нужно сделать, это скопировать указатель:

s = $1;

больше, чем трудно сказать, поскольку вы не предоставляете достаточно контекста, чтобы увидеть, что вы на самом деле пытаетесь сделать.

Ошибка сегментации происходит из-за того, что вы пытаетесь скопировать строку из памяти, выделенной strdup, в память, на которую указываетs, но вы никогда не инициализируете s, чтобы указывать на что-либо.


1 Функция strdup вызывает malloc для выделения точно достаточного объема памяти для строкивы дублируете

0 голосов
/ 29 ноября 2018

Вы должны malloc полукокса * s

#include <stdlib.h>
#include <string.h>

// in your function
s = malloc(sizeof(char) * (strlen($1) + 1));
strcpy(s, $1);
...