我正在制作一个词法分析器,这是一个完整的功能。此函数将char,c作为参数,并将此char附加到已定义的char *数组(yytext)的末尾。然后它增加文本的长度(yylen)。
当它进入此功能时,我一直在显示的行上获得段错误。我在这做错了什么?感谢。
BTW:不能使用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++;
}
答案 0 :(得分:1)
你有
extern int *yylen;
但尝试使用它如下:
int s = (int)yylen + 1;
如果变量是int *
,请将其用作int *
和取消引用以获取int
。如果它应该是int
,那么就这样声明它。
答案 1 :(得分:0)
这不起作用:
int s = (int)yylen + 1; //gets yylen (length of yytext) and adds 1
char newArray[s];
使用malloc或足够大的缓冲区
答案 2 :(得分:0)
每个C风格的字符串都应该以null结尾。根据您的描述,您似乎需要在c
附加字符。因此,您需要2个额外的位置(一个用于附加字符,另一个用于空终止符)。
接下来,yylen
的类型为int *
。您需要取消引用它以获取长度(假设它指向有效的内存位置)。所以,试试 -
int s = *yylen + 2;
我没有看到临时数组的需要但是你可能有这样做的原因。现在,
yytext[i] = newArray[i]; //seg faults here
您必须检查yytext
是否指向有效的写入内存位置。如果是,那么它是否足够长以填充附加字符和空终止符。
但我建议使用std::string
而不是使用字符数组。使用它将是解决问题的一个方法。