If we remove the null-termination, the program will attempt to read from the array outside of its indexes.
The program will cause run-time errors upon the program attempting to view an value at a non-existing index. This happens in pretty much every programming language I can think of.
The key differences between 3a and 3b seems to be that, first and foremost, 3a has its variables put on the stack during function-calls putting them in scope, while the other variables,
the globals, are put on the heap since they need to be accessed from all over the place. Recalling from how stack-pointers work in D0013E, it's obvious why they differ.
As far as safety goes, having global variables, the first thing to come from mind, as we learned in D0003e, is that multi-threading can potentially screw up a lot of values,
interrupt-and-overwrite writes and perhaps even do worse. That is, unless we use proper functionality such as Mutex to stop that from occuring.