I have a new question for you all now related to the same project. Is it bad to do the following?

Code:
if(resman->Get_Item(2) != NULL && !player->AquireItem(*resman->Get_Item(2)))  //true on item was placed successfuly false on fail.
    {
       allegro_message("Aquire Item Failed");
    }
For some reason when I run this chunk of code - even without error checking the whole program freezes up.

Code:
bool Character::AquireItem(PAS_Item item) //Places an item in the inventory
{
	for(int x = 0;x < 16;x++)
	{
       for(int y = 0;y < 7;y++)
       {
          switch(item.GetSize())
          {
              case 1:
                 if(inventory[x][y].GetID() == 0){inventory[x][y] = item;return true;}
              case 2:
                 if(x != 15 &&  //checking for side of inventory to not go over the array bounds while checking for bad placements.
                    inventory[x][y].GetID() == 0 &&
                    inventory[x+1][y].GetID() == 0)
                    {
                      inventory[x][y] = item;
                      inventory[x+1][y].SetID(-1);
                      return true;
                    }
              case 3:
                 if(y != 5 && y != 6 &&
                    inventory[x][y].GetID() == 0 &&
                    inventory[x][y+1].GetID() == 0 &&
                    inventory[x][y+2].GetID() == 0)
                    {
                      inventory[x][y] = item;
                      inventory[x][y+1].SetID(-1);
                      inventory[x][y+2].SetID(-1);
                      return true;
                    }
              case 4:
                  if(x != 15 && y != 6 &&
                    inventory[x][y].GetID() == 0 &&
                    inventory[x][y+1].GetID() == 0 &&
                    inventory[x+1][y+1].GetID() == 0 &&
                    inventory[x+1][y].GetID() == 0)
                    {
                      inventory[x][y] = item;
                      inventory[x+1][y+1].SetID(-1);
                      inventory[x][y+1].SetID(-1);
                      inventory[x+1][y].SetID(-1);
                      return true;
                    }
              case 6:
                  if(x != 15 && y != 5 && y != 6 &&
                    inventory[x][y].GetID() == 0 &&
                    inventory[x][y+1].GetID() == 0 &&
                    inventory[x+1][y+1].GetID() == 0 &&
                    inventory[x][y+2].GetID() == 0 &&
                    inventory[x+1][y+2].GetID() == 0 &&
                    inventory[x+1][y].GetID() == 0)
                    {
                      inventory[x][y] = item;
                      inventory[x][y+1].SetID(-1);
                      inventory[x+1][y].SetID(-1);
                      inventory[x+1][y+1].SetID(-1);
                      inventory[x+1][y+2].SetID(-1);
                      inventory[x][y+2].SetID(-1);
                      return true;
                    }
              default:
                 return false;
          }
       }
    }
    return false;
}
Code:
PAS_Item* resource_manager::Get_Item(int which)
{
    if(which >= 0 && which < Num_Item)return Item_List[which];
    else return NULL;
}