title: C - Process exited with error code 3221225477
body: <p>I'm doing a shift-reduce algorithm for our compiler design subject. This is the code.</p>
  
  <pre><code>void shiftReduce(char str[MAX_CHAR], int prodNum, int line)
  {
      int limit = 5, y=0;
      int substrFlag = 1; //0 true 1 false
      int ctr,x, counter;
      int match, next;
      char stack[MAX_CHAR];
      clearString(stack);
      OUTER:while ((strcmp(stack, prod[0].left) != 0) &amp;&amp; (y &lt; limit))
      {
          addChar(stack, str[0]);
          strcpy(str, dequeue(str));
          printf("Stack = %s\nQueue = %s\n", stack, str);
          for (ctr = 0; ctr &lt; prodNum; ctr++)
          {
              if (strstr(stack, prod[ctr].right) != NULL)
              { //substring found
                  substrFlag = 0;
                  strcpy(stack, replace(stack, prod[ctr].right, prod[ctr].left));
                  goto OUTER;
              }
          }
          if ((str[0] == '\n') || (str[0] == '\0'))
              y++;
      }
      if (strcmp(stack, prod[0].left) == 0)
          ;//printf("%s - Accepted.\n", stack);
      else
          printf("Syntax error on line %i\n", line);
  }
  </code></pre>
  
  <p>When I comment the <code>printf("Stack = %s\nQueue = %s\n", stack, str);</code> line, it works well. But when I uncomment it, it returns the code <code>3221225477</code>.</p>
  
  <p>BTW. This is the dequeue function: </p>
  
  <pre><code>char * dequeue (char str[MAX_CHAR])
  {
      int x = 0; char temp;
      for (x = 0; x &lt; length(str); x++)
      {
          if ((x+1) &lt; length(str))
              str[x] = str[x+1];
      }
      return str;
  }
  </code></pre>
  
  <p>and the addChar function:</p>
  
  <pre><code>void addChar (char * str, char letter)
  {
      int a = 0;
      while (str[a] != '\0')
          a++;
      str[a] = letter;
      str[a+1] = '\0';
      return;
  }
  </code></pre>
  
  <p>and finally replace function.</p>
  
  <pre><code>char * replace (char orig[MAX_CHAR], char substr[MAX_CHAR], char rep[MAX_CHAR])
  {
      int match, end=0, next=0;
      int flag = 0; //0 true 1 false
      char temp [MAX_CHAR];
      char store[MAX_CHAR];
      if (strstr(orig, substr) == NULL)
          return NULL;
      int x,y;
      for (x = 0; x &lt; length(orig); x++)
      { 
          if (orig[x] == substr[0]) //if current character  is equal to first character of substring
          {
              match = x;
              for (y = 0; y &lt; length(substr); y++)
              { 
                  if (orig[match+y] != substr[y])
                  {
                      flag = 1;
                      break;  
                  }
              }
              if (flag == 0)
              {
                  next = match + length(substr);
                  for (y = 0; y &lt; length(rep); y++)
                  { 
                      temp[match+y] = rep[y]; 
                      end = (match+y);
                  }
                  for (y = next; y &lt; length(orig); y++)
                  { 
                      temp[y] = orig[next+(y-next)];
                  }
                  return temp;
              }
          }
          else
          {
              addChar(temp, orig[x]);
          }
      }
      return temp;
  }
  </code></pre>
  
  <p>PS. The <code>prod</code> array:</p>
  
  <pre><code>struct RULES
  {
      char left[MAX_CHAR];
      char right[MAX_CHAR];
  } RULES;
  struct RULES prod[MAX_RULES];
  </code></pre>