You passed 'data' to glBufferData, which means that the buffer is initialized with the stuff in 'data', not that 'data' is your buffer object. Your buffer object's memory is in video memory, you have to read it with glGetBufferSubData or by reading the mapped pointer after a call to glMapBuffer[Range].
If you want your own allocated memory (in this case 'data') to be the backing store of the buffer itself then you have to take a look at the
AMD_pinned_memory extension, as that would allow you to do so. But I suppose that's not what you wanted to do here, just you misunderstood how buffer objects work.