das liegt daran, dass du an der stelle in print_array ein sizeof auf einen Pointer machst; und ein Pointer auf einer 32-Bit Maschine ist immer 4 Bytes groß (egal wie der typ ist).
Du müsstest wenn schon die größe mitgeben; also in diesem fall
void print_array (int *a, int laenge) {
}
und pass auf, wenn du lokale deklarationen machst
ist zwar solange okay bis du das array vergrößern willst; lokale deklarationen kannst du in ihrer größe nicht ändern; du müsstest dann schon mit malloc, realloc und free arbeiten (oder wenn du richtig c++ schreiben willst mit new und delete, wobei du dir dann das realloc für new/delete selber schreiben musst). Wenn du wissen willst, wie das alles passiert in c/c++, kann ich dir selber schreiben nur empfehlen; ansonsten benutz so sachen wie die STL; damit kann man auch schnell und effizient programmieren!