SDL read access violation SDLK_LEFT

Hi everyone I´m wondering why this error appears, I checked the code twice. still can’t realize where this error comes from and why I hope yo can help me. everything (libs and header files) has been linked properly but the program stops and throws the following error:
Exception thrown: read access violation.
keys was 0x7FFBEFDCFE2A

here´s the whole code:

#include <SDL.h>
#include <stdio.h>
#include <stdlib.h>

#include <windows.h>

#define GLUT_DISABLE_ATEXIT_HACK

#include <GL/GL.h>
#include <GL/glu.h>

const GLsizei windowWidth = 500;
const GLsizei windowHeight = 500;

GLfloat cubeRotateX = 45.0f;
GLfloat cubeRotateY = 45.0f;

const Uint8 *keys = NULL;

GLvoid establishProjectionMatrix(GLsizei width, GLsizei height)
{
glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(50.0f, (GLfloat)width / (GLfloat)height, 0.1f, 200.0f);

}

GLvoid initGL(GLsizei width, GLsizei height)
{
establishProjectionMatrix(width, height);

glShadeModel(GL_SMOOTH);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_PERSPECTIVE_CORRECTION_HINT);

}

GLvoid displayFPS(GLvoid)
{
static long lastTime = SDL_GetTicks();
static long loops = 0;
static GLfloat fps = 0.0f;

int newTime = SDL_GetTicks();

if (newTime - lastTime > 100)
{
    float newFPS = (float)loops / float(newTime - lastTime) * 1000.0f;

    fps = (fps + newFPS) / 2.0f;

    char title[80];
    printf(title, "OpenGL Demo - %2f", fps);

 

    lastTime = newTime;

    loops = 0;
}

loops++;

}

GLvoid drawScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0, 0, -5.0f);
glRotatef(cubeRotateX, 1, 0, 0);
glRotatef(cubeRotateY, 0, 1, 0);

//draw cube
glBegin(GL_QUADS);
//top face
glColor3f(1.0f, 0.5f, 0.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);

//bottom face
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);

//front face
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);

//back face
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);

//left face
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);

//right face
glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glEnd();

glFlush();



displayFPS();

}

GLboolean checkKeys(GLvoid)
{
static long lastTime = SDL_GetTicks();

const GLfloat speed = 1.0f;
const long updateTime = 10;

if (keys[SDLK_ESCAPE])
    return true;

long newTime = SDL_GetTicks();

if (newTime - lastTime > updateTime)
{
    if (keys[SDLK_LEFT])
        cubeRotateY -= speed;
    if (keys[SDLK_RIGHT])
        cubeRotateY += speed;
    if (keys[SDLK_UP])
        cubeRotateX -= speed;
    if (keys[SDLK_DOWN])
        cubeRotateX += speed;
}

return false;

}

int main(int argc, char** argv) {

SDL_Window* screen = SDL_CreateWindow("Cube",
    10,
    10,
    windowWidth, windowHeight,
    SDL_WINDOW_OPENGL);

if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
    //printf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    //exit(1);
}

if (screen == NULL)
{
    //printf(stderr, "Unable to create OpenGL scene: %s\n", SDL_GetError());
  //exit(2);
}




initGL(windowWidth, windowHeight);

//SDL_GL_SwapWindow(screen);

int done = 0;

while (!done)
{
    drawScene();

    SDL_Event event;
    while (SDL_PollEvent(&event))
    {
        if (event.type == SDL_QUIT)
            done = 1;

        keys = SDL_GetKeyboardState(NULL);
    }

    if (checkKeys())
        done = 1;
}

SDL_Quit();

return 0;

}

Keyboard state is indexed by scancode, not keysym.