使用printf在yacc中打印字符串文字标记会导致分段错误

时间:2018-11-29 01:44:18

标签: c parsing yacc lex

我正在尝试在Yacc中使用char指针打印字符串,但是当我尝试打印时,这会给我一个段错误。在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 :(得分:3)

您的词法分析器返回指向包含该字符串的已分配内存 1 的指针,因此您可能要做的就是复制指针:

s = $1;

很难说的更多,因为您没有提供足够的上下文来查看您实际要做什么。

发生分段错误是因为您试图将字符串从strdup分配的内存复制到s所指向的内存,但是却从未初始化s来指向任何内容。


1 strdup函数调用malloc为要复制的字符串分配足够的存储空间

答案 1 :(得分:0)

您必须分配char * s

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

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