The behavior you are seeing is in fact the correct behavior. The reason is, you are not actually allocating any stack space to store the three string values; instead, you are just allocating an array of pointers to them, which then point into the data segment of your program, where those strings only exist once. What you probably want is to declare space on the stack for them so a local copy is made of the values so they are initialized to the same thing every time.
char tab[][4] = { "abc", "klm", "xyz" };
Doing it this way will produce the result you expect.
As a side note, some compilers will place static strings ("abc", etc.) into read only memory (if available) and your program would crash. Therefore, doing it the second way not only produces the desired result, it is safer for cross-platform development.
Hope this helps,
Alex