在编译器中使用指针的问题

时间:2009-06-24 05:09:51

标签: compiler-construction pointers

我正在尝试完成一个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:访问冲突。

你知道我该怎么办呢?

3 个答案:

答案 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,否则它可能继续在数组之外搜索。更好的方法可能是改为使用某种形式的哈希表并进行查找。