【问题标题】:Printing a string literal token in yacc using printf causes a segmentation fault使用 printf 在 yacc 中打印字符串文字标记会导致分段错误
【发布时间】:2018-11-29 01:44:17
【问题描述】:

我试图在 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);

它给了我一个分段错误。为什么会这样做,如何解决?

【问题讨论】:

    标签: c parsing yacc lex


    【解决方案1】:

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

    s = $1;
    

    很难说更多,因为您没有提供足够的上下文来了解您实际尝试做什么。

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


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

    【讨论】:

      【解决方案2】:

      你必须 malloc char *s

      #include <stdlib.h>
      #include <string.h>
      
      // in your function
      s = malloc(sizeof(char) * (strlen($1) + 1));
      strcpy(s, $1);
      

      【讨论】:

      • 请注意,strdup 已经为字符串分配了存储空间——分配更多存储空间和复制可能会泄漏 strdup 分配的存储空间...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多