title: C++ STATUS_ACCESS_VIOLATION error when program runs
body: <p>Everytime I run the program, this mysterious error pops up saying that I have some type of status access violation. I have tried googling it and all it comes up with is that I might be trying to access some memory that is not allowed. Help would be highly appreciated!</p>
  
  <p>Here is the error when I run the program:</p>
  
  <pre><code>      2 [main] a 5772 exception::handle: Exception: STATUS_ACCESS_VIOLATION
     1532 [main] a 5772 open_stackdumpfile: Dumping stack trace to a.exe.stackdump
  </code></pre>
  
  <p>Here is the .cpp code:</p>
  
  <pre><code>int main()
  {
     Stack s;  //variable declarations
     StackItem *newItem;
     char token, nextChar, prevChar, response, check;
     int lineCount, apostCount;
     char filename[50];
     bool insideComment = false, insideString = false, error, isMatch, delimError = false;
     fstream sourceFile;
  
     do  //do while response is 'y'
     {
        do //do while opening the source file fails
        {
           cout &lt;&lt; "Enter filename of source file: ";
           cin.getline (filename,51);
           sourceFile.open(filename);  //opens the file with given filename
           if (sourceFile.fail())
              cout &lt;&lt; "File could not be opened" &lt;&lt; endl;  //error if can't open
           sourceFile.clear();
        } 
        while (sourceFile.fail());  //exits if source file doesn't fail
  
        sourceFile.clear();
        lineCount = 0;  //initializes line count to zero
  
        while (!sourceFile.eof())  //exits if end of source file is reached
        {
           sourceFile.get(nextChar);  //gets the next character in file
  
              if ((int)nextChar == '\n')  //if next character is an end line
              {
                 lineCount++;  //increments line count
                 cout &lt;&lt; "Line count: " &lt;&lt; lineCount &lt;&lt; endl;  //echoes line count
              }
  
              else if (nextChar == '{' || nextChar == '[' || nextChar == '(')
              {  //continues if next char is an opening token
                 newItem-&gt;token = nextChar;  //sets newItem's token
                 newItem-&gt;lineNumber = lineCount;  //sets newItem's line count
                 if (!s.isFull())  //continues if stack isn't full
                    s.push(newItem);  //pushes newItem onto the stack
                 s.displayStack();  //displays the stack
              }
  
              else if (nextChar == '}' || nextChar == ']' || nextChar == ')')
              {  //continues if next char is a closing token
                 if (!s.isEmpty())  //continues if stack isn't empty
                 {
                    isMatch = s.matchStack(nextChar);  //checks if token matches top
  
                    if (isMatch == true)  //if true, pops the top of the stack
                       s.pop();
  
                    else  //continues if match is false
                    {
                       newItem-&gt;token = nextChar;  //sets newItem's token
                       newItem-&gt;lineNumber = lineCount;  //sets newITem's line count
                       s.trailingItem(newItem);  //calls the trailingItem function
                       cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): ";
                       cin &gt;&gt; response;  //asks user whether to continue
  
                       while (response != 'y' &amp;&amp; response != 'n')  //checks for input error
                       {
                          cout &lt;&lt; "Error! Must enter either y for yes or n for no." &lt;&lt; endl;
                          cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): ";
                          cin &gt;&gt; response;
                       }
                       break;  //leaves the while loop
                    }
                 }
  
                 else if (s.isEmpty())  //continues if stack is empty
                 {
                    newItem-&gt;token = nextChar;  //sets newItem's token
                    newItem-&gt;lineNumber = lineCount;  //sets newItem's line count
                    s.push(newItem);  //pushes newItem onto the top of the stack
                    s.processStack();  //processes the error
                    cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): ";
                    cin &gt;&gt; response;  //asks user whether to continue
  
                    while (response != 'y' &amp;&amp; response != 'n')  //checks for input error
                    {
                       cout &lt;&lt; "Error! Must enter either y for yes or n for no." &lt;&lt; endl;
                       cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): ";
                       cin &gt;&gt; response;  //gets user input
                    }
  
                    break;  //leaves the while loop
                 }
  
                 s.displayStack();  //displays the items on the stack
              }
  
              else if (nextChar == '/')  //continues if next char is a '/'
              {
                 sourceFile.get(nextChar);  //gets the next character in file
  
                 if (nextChar == '*')  //continues if next char is a '*'
                 {  //at this point a comment has started because of '/' then '*'
                    insideComment = true;  //sets bool to true
                    newItem-&gt;token = 'c';  //sets newItem's token to c for "comment"
                    newItem-&gt;lineNumber = lineCount;  //sets newItem's line count
                    s.push(newItem);  //pushes the item onto the stack
  
                    while (insideComment == true &amp;&amp; !sourceFile.eof())
                    {  //continues while inside a comment and end of file isn't reached
                       sourceFile.get(nextChar);  //gets the next character in file
  
                       if (nextChar == '*')  //continues if next char is *
                       {
                          sourceFile.get(nextChar);  //gets the next character in file
  
                          if (nextChar == '/')  //continues if next char is '/'
                          {  //at this point the comment has ended because of '*' then '/'
                             insideComment = false;  //sets bool to false
                             s.pop();  //pops off the c in the stack
                          }
                       }
                    }
                 }
  
                 else if (nextChar == '/')  //continues if next char is a '/'
                 {  //at this point a comment has started because of / then another '/'
                    insideComment = true;  //sets bool to true
  
                    while (insideComment == true &amp;&amp; !sourceFile.eof())
                    {  //continues while inside a comment and not at end of file
                       sourceFile.get(nextChar);  //gets the next character in file
  
                       if (nextChar == '\n')  //leaves comment if next line is entered
                          insideComment = false;  //sets bool to false
                    }
                 }
              }
  
              else if (nextChar == '\n')  //continues if next char is an end line
              {
                 lineCount++; //increments line count
                 cout &lt;&lt; "Line count: " &lt;&lt; lineCount &lt;&lt; endl;  //echoes line count
              }
  
              else if (nextChar == '\"' &amp;&amp; insideComment == false)
              {  //continues if next char is a " and is not currently inside a comment
                 insideString = true;  //sets bool to true b/c " starts a string
  
                 while (insideString == true &amp;&amp; !sourceFile.eof())
                 {
                    sourceFile.get(nextChar);  //gets the next character in file
  
                    if (nextChar == '\"')
                       insideString = false;
  
                    else if (nextChar == '\n')
                    {
                       lineCount++;  //increments line count
                       cout &lt;&lt; "Line count: " &lt;&lt; lineCount &lt;&lt; endl;  //echoes line count
                    }
                 }
              }
  
              else if (nextChar == '\'' &amp;&amp; insideComment == false &amp;&amp; insideString == false)
              {  //continues if next char is a ' and not in a comment or string
                 apostCount = 1; //initializes apostrophe count (chars after first apostrophe)
  
                 while (nextChar != '\'' &amp;&amp; !sourceFile.eof())
                 {  //continues while next char isn't another ' and not end of file
                    sourceFile.get(nextChar);  //gets the next character in file
                    prevChar = nextChar;
                    apostCount++;  //increments apostrophe count
  
  
                    if (nextChar == '\'' &amp;&amp; prevChar == '\\' &amp;&amp; apostCount &lt;= 3)    
                       nextChar = ' ';  //sets next char to space if 3 or more apostrophes
  
                    else if (nextChar == '\n')  //continues if next char is an end line
                    {
                       lineCount++;  //increments line count
                       cout &lt;&lt; "Line count: " &lt;&lt; lineCount &lt;&lt; endl;  //echoes line count
                    }
                 }
  
                 if (apostCount &gt;= 4)  //if more than 3 chars come after apostrophe
                 {  //displays delimeter error
                       cout &lt;&lt; "Character delimeter error on line " &lt;&lt; lineCount &lt;&lt; endl;
                       delimError = true;
                 }
  
                 if (delimError == true) //continues if delimiter error occured
                    break;  //leaves 2nd while loop
              }
        }  //end of while loop
  
        if (s.isEmpty() == true)  //continues if no errors within stack
        {  //displays successful nesting structure to user
           cout &lt;&lt; "Source file of " &lt;&lt; lineCount &lt;&lt; " lines has proper nesting structure";
           cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): ";  //asks to continue
           cin &gt;&gt; response;  //gets user's response
  
           while (response != 'y' &amp;&amp; response != 'n')  //checks for input error
              {
                 cout &lt;&lt; "Error! Must enter either y for yes or n for no." &lt;&lt; endl;
                 cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): ";
                 cin &gt;&gt; response;  //gets user input
              }
        }
  
        else  //continues if errors are present
        {
           s.processStack();  //processes and displays the delimiter errors
           cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): ";  //asks to continue
           cin &gt;&gt; response;  //gets user's response
  
           while (response != 'y' &amp;&amp; response != 'n')  //checks for input error
           {
              cout &lt;&lt; "Error! Must enter either y for yes or n for no." &lt;&lt; endl;
              cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Process another file? (y/n): ";
              cin &gt;&gt; response;  //gets user input
           }
        }
     } 
     while (response == 'y');  //opens another file if user entered y for yes
     return 0;  //quits program
  }
  </code></pre>
  
  <p>Here is the .h code:</p>
  
  <pre><code>struct StackItem  //defines StackItem structure
  {
     char token;  //holds delimeter
     int lineNumber;  //holds the line number of the delimeter in the source file
     StackItem *next;  //points to the next structure
  };
  
  typedef StackItem* nodePtr;
  const int MAX_ITEMS = 99;
  
  class Stack  //Stack class definition
  {
     private:
  
        nodePtr top;  //points to the top of the stack
        int numberItems;  //number of items in the stack
  
     public:
  
        Stack()  //initializes private variables
        { top = NULL; numberItems = 0; }
  
        ~Stack()
        { while (numberItems &gt; 0)
         { pop();
         }     
        }
  
        bool isEmpty()  //returns whether the stack is empty or not
        { return top == NULL; }
  
        bool isFull()  //returns whether the stack is full or not
        { return MAX_ITEMS == numberItems;}
  
        void push(nodePtr newItem)  //pushes a new item onto the top of the stack
        {
           newItem-&gt;next = top;
           top = newItem;
           numberItems++;
        }
  
        void pop()  //removes the item on top of the stack
        {
           nodePtr p = top;  //sets pointer p to what top points to
           top = top-&gt;next;  //top is set to the next struct in stack
           delete p;  //deletes the top item in the stack
           numberItems--;
        }
  
        void displayStack()  //displays all of the items on the stack
        {
           nodePtr p = top;  //sets pointer p to what top points to
           cout &lt;&lt; "Stack Contents: " &lt;&lt; endl;
           while(p != NULL)  //while loop to display the stack contents
           {
              cout &lt;&lt; p-&gt;token &lt;&lt; " on line " &lt;&lt; p-&gt;lineNumber &lt;&lt; "." &lt;&lt; endl;
              p = p-&gt;next;
           }
        }
  
        void processStack()  //displays the error for each delimeter in stack
        {
           nodePtr p = top;  //sets pointer p to what top points to
           while (p != NULL)  //continues until p points to NULL
           {
              cout &lt;&lt; "\" " &lt;&lt; p-&gt;token &lt;&lt; " \" on line " &lt;&lt; setw(5) &lt;&lt; right;
              cout &lt;&lt; p-&gt;lineNumber &lt;&lt; " has no matching element" &lt;&lt; endl;
              p = p-&gt;next;
           }
        }
        //determines whether the stack delimeter matches the current character
        bool matchStack(char character)  
        {
           bool match = false;
           if (top-&gt;token == '{')
           {
              if (character == '}')
                 match = true;  //sets bool to true if we have { and }
           }
           else if (top-&gt;token == '[')
           {
              if (character == ']')
                 match = true;  //sets bool to true if we have [ and ]
           }
           else if (top-&gt;token == '(')
           {
              if (character ==  ')')
                 match = true;  //sets bool to true if we have ( and )
           }
           return match;  //returns the bool
        }
        //called if we have a trailing item that doesn't match stack delimeter
        void trailingItem(nodePtr newItem) //displays what doesn't match
        {
           cout &lt;&lt; "\" " &lt;&lt; top-&gt;token &lt;&lt; " \" on line " &lt;&lt; setw(5) &lt;&lt; right;
           cout &lt;&lt; top-&gt;lineNumber &lt;&lt; " doesn't match \" " &lt;&lt; newItem-&gt;token;
           cout &lt;&lt; " \" on line " &lt;&lt; setw(5) &lt;&lt; right &lt;&lt; newItem-&gt;lineNumber;
        }
  };
  </code></pre>
  
  <p>Here is the a.exe.stackdump file: </p>
  
  <pre><code>Exception: STATUS_ACCESS_VIOLATION at eip=00401701
  eax=61100049 ebx=0028CD40 ecx=00A01998 edx=00000000
  esi=0028CD40 edi=00000000 ebp=0028CD18 esp=0028CAF0
  program=C:\Users\Tyler\Desktop\Program 2\a.exe, pid 5772, thread main
  cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
  Stack trace:
    Frame Function Args
    0028CD18 00401701 (00000001, 009E8628, 009E8510, 00000001)
    0028CD68 61007038 (00000000, 0028CDA4, 61006980, 7EFDE000)
  End of stack trace
  </code></pre>