Проблемы использования указателей в компиляторе - PullRequest
0 голосов
/ 24 июня 2009

Я пытаюсь выполнить аналексическую проверку, но у меня возникли проблемы с указателями, это мой код

    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 ]

3 голосов
/ 24 июня 2009

Должно быть NULL, а не "NULL" (в 2 местах).

Объяснение: условие слова [handle]! = "NULL" не соответствует ожиданиям. Он сравнивает указатели, а не строки. Таким образом, возможно, что вы никогда не выйдете из этого цикла, и это приведет к незаконному доступу к памяти. NULL, с другой стороны, является указателем, а не строкой, а NULL всегда равен NULL.

1 голос
/ 24 июня 2009

Приведенные выше ответы хороши, но в качестве более общего совета, когда вы сталкиваетесь с ошибкой во время выполнения, подобной этой, хорошим первым шагом в выяснении причины проблемы является просмотр вашей программы в отладчике, и посмотрите, какая строка кода вызывает проблему (например, просматривая стек вызовов).

0 голосов
/ 24 июня 2009

Чтобы добавить к тому, что написал Игорь, вы также должны добавить еще одну запись в ваш массив указателей (если «NULL» является частью вашей грамматики):

  ...
  "not",
  "do",
  "while",
  "mod",
  "NULL",
  NULL      // marks end of array
};

таким образом вы можете искать до слов [handle]! = NULL, иначе он может продолжить поиск за пределами массива. Еще лучший подход - вместо этого использовать хеш-таблицу и выполнять поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...