It is true that bar
has reserved 2 characters, and you're filling it with 8 more characters than it can handle.
That doesn't automatically mean seg-fault.
You don't know what is in those over-flowed 8 characters, and it is likely meaningless garbage that is safe to overwrite. The seg-fault will happen when you actually overwrite into another page of Virtual Memory, or overwrite something important (like a device driver, or program code).
This is a good example of undefined behavior. Undefined doesn't mean it WILL fail, it really means that the behavior is undefined; it might work, it might fail, monkeys may fly out of the USB port... anything could happen. In this case, it actually works, but you cannot rely on that behavior, because it might be different the next time you run the program.
And finally, just because there isn't an immediate failure, it doesn't mean you didn't damage the system. You might've screwed up memory with your overwrite, and you may not see it until much further in your program, when it suddenly crashes on completely normal code that happened to rely on the same area of memory.
BTW: There's another bug in your code.
You describe my_ascii
as 10 characters, but you try to copy 11 chars into it.
Don't forget about the NULL-terminator at the end of strings!
This means the string "0123456789"
actually requires 11 characters of storage.