Array is affecting digitalread values
I have to disagree that your first sketch is working. I suppose that a very fast blinking led seems to be "on".

When you describe what should happen in a logic way, then you can put that into code.

The logic is: The led is on, if at least one of the buttons is pressed.
In other words: The led is off, if no button is pressed, else the led is on.

This logic has as a result that the led stays on if a second button is pressed and after that the first button is released. I assume this is okay.

For two buttons it is possible to check both conditions.

if (digitalRead(button.pin) == HIGH || digitalRead(button2.pin) == HIGH)
  digitalWrite(ledPin, HIGH);
else
  digitalWrite(ledPin, LOW);


Or test for LOW:

if (digitalRead(button.pin) == LOW &amp;&amp; digitalRead(button2.pin) == LOW)
  digitalWrite(ledPin, LOW);
else
  digitalWrite(ledPin, HIGH);


For multiple buttons, a bool can be used or the number of pressed buttons can be counted.

A fixed number for the array size is easy and has less chance for a mistake:

#define BUTTONS_COUNT 2


It is also possible to use sizeof(). The total size has to be divided by the size of one element:

int count = 0;
for (int i = 0; i&lt;sizeof(buttons)/sizeof(Button); i++) {
  if (digitalRead(buttons[i].pin) == HIGH) {
    count++;
  }
}

if (count == 0)
  digitalWrite(ledPin, LOW);
else
  digitalWrite(ledPin, HIGH);