Why is it that I can increment pointers to read past the length of an allocated variable, and the OS doesn't stop me? Surely, since it was the one that set aside 4 bytes for an integer, it should know that it shouldn't allow any pointer to go past those 4 bytes?

In fact, when I increment a pointer past the allocated bytes of a variable, what exactly am I reading/ Are those adjacent memory locations? And since each program is supposed to have its own "address space", can't I do anything I want within that "address space" without a segfault? It should be impossible to read memory that belongs to other programs if each program had its own "address space", right?