title: C Help: MSVC debugger gets an "error reading characters of string" error... but only sometimes
body: <p>I am making a 5 card poker game, but I keep getting an error when running the program in the debugger.</p>
  
  <p>I ran this code through my debugger 8 times and of those I got an error 5 times — without changing any of the code. What could be causing it to read a string improperly only sometimes? Please help me figure it out. </p>
  
  <p>Necessary code:</p>
  
  <p>-Initialization</p>
  
  <pre><code>char *suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades"};
  char *face[13] = {"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", 
  "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
  Card p1_hand[5] = {{0,0,0}};
  </code></pre>
  
  <p>-Function call in main</p>
  
  <pre><code>print_hand(face, suit, p1_hand);
  </code></pre>
  
  <p>-Functions in header file // Card struct</p>
  
  <pre><code>typedef struct card
  {
  int card_number;
  int face_index;
  int suit_index;
  } Card;
  
  void print_hand (char *face[4], char *suit[13], Card p1_hand[5]);
  </code></pre>
  
  <p>-Function itself</p>
  
  <pre><code>void print_hand (char *face[], char *suit[], Card p1_hand[5])
  {
  int i = 0, j = 0, k = 0;
  
  printf("You're hand:\n");
  for(i = 0; i &lt; 5; i++)
  {
      j = p1_hand[i].face_index;
      k = p1_hand[i].suit_index;
      printf("%d: %5s of %-8s\n", (i+1), face[j], suit[k]);
  }
  }
  </code></pre>
  
  <p>I put a debugger stopping point before the first printf and sometimes I get this out of it</p>
  
  <ul>
  <li><code>face   0x0040fb5c {0x0000000a Error reading characters of string.}</code></li>
  </ul>
  
  <p>but other times I get this... without changing the code at all</p>
  
  <ul>
  <li><code>face   0x002afe40 {0x013a787c "Ace"}</code>  (which is correct)</li>
  </ul>
  
  <p>Please help me figure this out! It's driving me crazy.</p>
  
  <p><strong>EDIT</strong>
  *<em>MY CODE</em>*</p>
  
  <p><strong>main.c</strong></p>
  
  <pre><code>#include "poker.h"
  
  int main (void)
  {
  //initialize arrays
  char *suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades"};
  char *face[13] = {"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", 
  "Nine", "Ten", "Jack", "Queen", "King"};
  int deck[4][13] = {0};
  int num_face_player_1[13] = {0}, num_face_dealer[13] = {0};
  int num_suit_player_1[4] = {0}, num_suit_dealer[4] = {0};
  
  //Players' hands
  Card p1_hand[5] = {{0,0,0}}, dealer_hand[5] = {{0,0,0}};
  
  //Other
  int count = 0;
  int menu = 0, choice_menu = 0;
  int invalid = 0;
  
  srand ((unsigned) time (NULL));
  
  //MENU
  do //menu loop
  {
      menu = print_menu ();
      choice_menu = 4; //so its not 0;
      choice_menu = menu_choice (menu);
  } while (choice_menu ==0);
  if (choice_menu == 2) //closes the game
  {
      return 0;
  }
  
  system ("cls");
  shuffle (deck);
  deal (deck, p1_hand);
  
  do //checks to make sure the dealer doesnt have any of the same cards
  {
      deal (deck, dealer_hand);
      invalid = 0;
      for(count = 0; count &lt; 5; count++)
      {
          if ((dealer_hand[count].card_number == p1_hand[count].card_number) &amp;&amp; (dealer_hand[count].face_index == p1_hand[count].face_index) &amp;&amp; (dealer_hand[count].suit_index == p1_hand[count].suit_index))
          {
              invalid = 1;
          }
      }
  } while (invalid == 1);
  
  for(count = 0; count &lt; 4; count++)
  {
      printf("%s\n", *suit[count]);
  }
  for(count = 0; count &lt; 13; count++)
  {
      printf("%s\n", *face[count]);
  }
  print_hand(face, suit, p1_hand);
  
  //these populate the number of facecards / suits arrays in order to see what hand you got
  pop_num_faces(num_face_player_1, p1_hand);
  pop_num_faces(num_face_dealer, dealer_hand);
  pop_num_suit(num_suit_player_1, p1_hand);
  pop_num_suit(num_suit_dealer, dealer_hand);
  
  return 0;
  }
  </code></pre>
  
  <p><strong>poker.h</strong></p>
  
  <pre><code>#ifndef POKER_H
  #define POKER_H
  
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;time.h&gt;
  #include &lt;conio.h&gt;
  #include &lt;dos.h&gt;
  
  typedef struct card
  {
      int card_number;
      int face_index;
      int suit_index;
  } Card;
  
  int print_menu (void);
  int menu_choice (int menu_choice);
  void press_any_key (void);
  void shuffle (int wDeck[4][13]);
  void deal(const int wDeck[][13], Card p_hand[5]);
  void pop_num_faces (int num_faces[], Card hand[5]);
  void pop_num_suit (int num_suit[4], Card hand[5]);
  void print_hand (char *face[4], char *suit[13], Card p1_hand[5]);
  void check_hand(Card p1_hand[5], int num_suit[], int num_faces[]);
  
  #endif
  </code></pre>
  
  <p><strong>poker.c</strong></p>
  
  <pre><code>#include "poker.h"
  
  //prints menu
  int print_menu (void)
  
  
  //decides what to do with the menu choice
  int menu_choice (int menu_choice)
  //Shuffles the deck
  void shuffle (int wDeck[4][13])
  {
  int row = 0;
  int column = 0;
  int card = 0;
  
  for (card = 1; card &lt;= 52; card++)
  {
      do
      {
          row = rand () % 4;
          column = rand () % 13;
      } while (wDeck[row][column] != 0);
  
      wDeck[row][column] = card;
  }
  }
  
  //deals the deck to the player
  void deal(const int wDeck[][13], Card p_hand[5])
  {
  int row = 0;
  int column = 0;
  int card = 0;
  int index = 0;
  
  for(card = 1; card &lt; 52; card++)
  {
      for (row = 0; row &lt;4; row++)
      {
          for (column = 0; column &lt; 13; column++)
          {
              if(wDeck[row][column] == card)
              {
                  p_hand[index].card_number = card;
                  p_hand[index].face_index = column;
                  p_hand[index].suit_index = row;
              }
          }   
      }
      index++;
  }
  }
  
  //populates num faces
  void pop_num_faces (int num_faces[], Card hand[5])
  {
  int i = 0;
  
  //program keeps populating num_faces with random numbers, so i have to  re-initialize here
      num_faces[0] = 0;
      num_faces[1] = 0;
      num_faces[2] = 0;
      num_faces[3] = 0;
      num_faces[4] = 0;
      num_faces[5] = 0;
      num_faces[6] = 0;
      num_faces[7] = 0;
      num_faces[8] = 0;
      num_faces[9] = 0;
      num_faces[10] = 0;
      num_faces[11] = 0;
      num_faces[12] = 0;
  
  for(i = 0; i &lt; 5; i++)
  {
      switch(hand[i].face_index)
      {
      case 0: num_faces[0] ++;
          break;
      case 1: num_faces[1] ++;
          break;
      case 2: num_faces[2] ++;
          break;
      case 3: num_faces[3] ++;
          break;
      case 4: num_faces[4] ++;
          break;
      case 5: num_faces[5] ++;
          break;
      case 6: num_faces[6] ++;
          break;
      case 7: num_faces[7] ++;
          break;
      case 8: num_faces[8] ++;
          break;
      case 9: num_faces[9] ++;
          break;
      case 10: num_faces[10] ++;
          break;
      case 11: num_faces[11] ++;
          break;
      case 12: num_faces[12] ++;
          break;
      }
  }
  }
  
  //populates num_suit
  void pop_num_suit (int num_suit[4], Card hand[5])
  {
  int i = 0;
  num_suit[0] = 0;
  num_suit[1] = 0;
  num_suit[2] = 0;
  num_suit[3] = 0;
  
  for(i = 0; i &lt; 5; i++)
  {
      switch(hand[i].suit_index)
      {
      case 0: num_suit[0] ++;
          break;
      case 1: num_suit[1] ++;
          break;
      case 2: num_suit[2] ++;
          break;
      case 3: num_suit[3] ++;
          break;
      }
  }
  }
  
  void print_hand (char *face[4], char *suit[13], Card p1_hand[5])
  {
  printf("You're hand:\n");
  for(i = 0; i &lt; 5; i++)
  {
      j = p1_hand[i].face_index;
      k = p1_hand[i].suit_index;
      printf("--DEBUG--: %d %d %d\n", p1_hand[i].card_number, j, k);
      printf("%d: %5s of %-8s\n", (i+1), face[j], suit[k]);
  }
  }
  </code></pre>