Самое простое решение - передать размер в массив:
void namesArray(std::string *numList, std::size_t numCount, std::string name)
Это будет , вероятно, работать для вас - вам нужно знать размер массива, когда вы передаете его, но это не требует, чтобы вы работали с массивом стека из этой области, и в общем случае вы, скорее всего, будете иметь доступ к размеру массива, чем к созданию массива в той же области, в которой вы вызываете функцию. Это также делает вещи намного более явными, и, если вы переключаетесь на массивы кучи вместо массивов стека, все равно работает нормально.
Вот в чем дело: вы всегда знаете размер массива. Буквально невозможно написать код, который создает массив неизвестного размера. Вы можете (не) преднамеренно забыть размер массива, но в какой-то момент он должен знать , потому что иначе вы буквально не можете создать массив. Вы можете знать это только во время выполнения, потому что, скажем, оно определяется пользовательским вводом, но это просто означает, что оно находится в переменной, и вы все еще знаете это , у вас просто нет предопределенного значения во время компиляции .
Кроме того, если размер массива определен во время выполнения, вы используете кучу массивов, и другое решение не будет работать для этого.