我正在尝试完成一个analexical验证,但是我遇到了一些指针问题,这是我的代码
case 6: c = next_carac(file);
for(handle=0;(words[handle] != "NULL");handle++)
{
strcpy(message, words[handle]);
if(!strcmp(token,message))
strcpy(message, "words");
}
if(isdigit(c) && strcmp(message,"words"))
{
step=6;
token[auxtoken]=c;
auxtoken++;
}
else if(isalpha(c) && strcmp(message,"words"))
{
step=6;
token[auxtoken]=c;
auxtoken++;
}
else
{
step=7;
return_carac(file);
}
break;
这些是声明的变量
const char *words[]={
"program",
"label",
"integer",
"word",
"char",
"byte",
"shortint",
"logint",
"real",
"single",
"double",
"string",
"boolean",
"var",
"procedure",
"function",
"begin",
"end",
"if",
"then",
"else",
"or",
"and",
"div",
"not",
"do",
"while",
"mod",
"NULL"
};
char token[80],message[30];
int step=0;
char c;
auxtoken=0;
但它产生了以下错误,我无法找到缓解方法
已加载'ntdll.dll',找不到匹配的符号信息。 加载'C:\ WINDOWS \ system32 \ kernel32.dll',找不到匹配的符号信息。 Main.exe中的第一次机会异常:0xC0000005:访问冲突。
你知道我该怎么办呢?
答案 0 :(得分:3)
它应该是NULL,而不是“NULL”(在2个地方)。
说明:条件字[handle]!=“NULL”没有按预期执行。它比较指针,而不是字符串。所以,你可能永远不会走出那个循环而导致非法的内存访问。另一方面,NULL是一个指针,而不是一个字符串,NULL总是NULL。
答案 1 :(得分:1)
上面的答案很棒,但作为一个更普遍的建议,当你遇到这样的运行时错误时,解决问题原因的第一步是在调试器中查看你的程序,看看导致问题的代码行(即通过查看调用堆栈)。
答案 2 :(得分:0)
要添加到Igor所写的内容,还应该在指针数组中添加一个条目(如果“NULL”是语法的一部分):
...
"not",
"do",
"while",
"mod",
"NULL",
NULL // marks end of array
};
这样你就可以搜索到[handle]!= NULL,否则它可能继续在数组之外搜索。更好的方法可能是改为使用某种形式的哈希表并进行查找。