The line you indicate that compiles produces a warning. Let's break apart your InitializeHero function.
person hero = {0,0, {0,0}};
Here you are instantiating your new person struct named hero. You use the brace initialization method to set the members of the struct. In this case, the only member of person is a loc. A loc itself only has two uint8_ts. Using the brace initialization method here, you would simply use {0, 0}.
Combining these two, you could write a statement like:
person hero = {{0, 0}};
Note that you can only use brace initialization when initializing. Your other two statements are assignments. The struct has already been initialized at this point, which is why those two statements don't compile.
One other note, your global variable static person hero has been shadowed by the local variable hero in InitializeHero. This means that you are creating a separate person struct in your InitializeHero. However, this static variable is initialized where it is declared in this case, so your statement must read
static person hero = {{0, 0}};
...leaving InitializeHero unused.