0

我正在制作一个词法分析器,这是整个事情的一个功能。此函数将 char、c 作为参数,并将此 char 附加到已定义的 char* 数组 (yytext) 的末尾。然后它增加文本的长度(yylen)。

当它进入这个函数时,我一直在显示的行上得到段错误。我在这里做错了什么?谢谢。

顺便说一句:不能使用 strncpy/strcat 等(尽管如果你愿意,你也可以向我展示那个实现)

这是我的代码:

extern char *yytext;
extern int *yylen;

void consume(char c){
    int s = *yylen + 1;                  //gets yylen (length of yytext) and adds 1
                                         //now seg faults here
    char* newArray = new char[s];
    for (int i = 0;i < s - 1;i++){
        newArray[i] = yytext[i];             //copy all chars from existing yytext into newArray
    }
    newArray[s-1] = c;                       //append c to the end of newArray
    for (int i = 0;i < s;i++){               //copy all chars + c back to yytext
        yytext[i] = newArray[i];
    }
    yylen++;
}
4

3 回答 3

1

你有

extern int *yylen;

但尝试像这样使用它:

int s = (int)yylen + 1;

如果变量是int *,则像使用它一样使用它int *并取消引用以获取int. 如果它应该是一个int,那么就这样声明它。

于 2013-09-10T22:04:19.773 回答
0

每个 C 风格的字符串都应该以 null 结尾。根据您的描述,您似乎需要将字符附加到c. 因此,您需要 2 个额外的位置(一个用于附加字符,另一个用于 null-terminator )。

接下来,yylen是类型int *。您需要取消引用它以获取长度(假设它指向有效的内存位置)。所以,试试——

int s = *yylen + 2;

我不认为需要临时数组,但您这样做可能是有原因的。现在,

yytext[i] = newArray[i];             //seg faults here

您必须检查是否yytext指向有效的写入内存位置。如果是,那么它是否足够长以填充附加字符和空终止符。

但我建议使用std::string字符数组而不是使用字符数组。使用它可以解决问题。

于 2013-09-10T22:13:37.183 回答
0

那行不通:

int s = (int)yylen + 1;                  //gets yylen (length of yytext) and adds 1
char newArray[s];

使用 malloc 或足够大的缓冲区

char * newarray=(char*)(malloc(s));
于 2013-09-10T22:00:14.840 回答