An alternative to oPossums code:
#define Bn (3)
uint8_t const button_port[Bn] = { 0 };
With this code you only need to change the define if the Bh needs to be changed.
Note that this initializes button_port[0] to 0, explicitly, and the rest to 0, implicitly. So you do the same initialization, in two different ways, combined in one command. IMHO, this may be confusing.
If you really want to initialize everything to 0, just omit the initializer; the C standard initializes all global data to zero.
If you wanted to change the table initialization to, say, 1, an inexperienced programmer in hurry might try to change that 0 to 1, assuming the whole table changes in a nice generic way. But it won't - only the first item changes, the array will be 1,0,0. Hence, it's better to leave the explicit initialization out completely, forcing you to think about it if you need to change the initial value (adding a for loop in the beginning of main is a viable generic option, then).
Also, at least some compilers seem to put all explicitly initialized data to the .data section, even if initialized to zero, wasting flash storage. When implicitly initialized to zero, it goes to .bss, without flash storage required.