В чем разница char arr[100] и char *arr1 = new char[100] и почему функция gets_s(char*) работает при gets_s(arr), но не работает gets_s(arr1)?
Посмотрите на определение gets_s:
char *gets_s(
char *buffer,
size_t sizeInCharacters
);
wchar_t *_getws_s(
wchar_t *buffer,
size_t sizeInCharacters
);
template <size_t size>
char *gets_s(
char (&buffer)[size]
); // C++ only
template <size_t size>
wchar_t *_getws_s(
wchar_t (&buffer)[size]
); // C++ only
В случае когда вы передаете именно массив, не указатель на массив, то шаблон сам вычисляет размер массива который вы ему передаете. Когда вы передаете указатель на массив, вам необходимо передать размер массива.
Про стек и кучу, можете прочитать на Wikipedia или в любом поисковике.
Вкратце, стек — это очень быстрое хранилище памяти, работающее по принципу LIFO и управляемое процессором. Но эти преимущества приводят к ограниченному размеру стека и специальному способу получения значений. Для того, чтобы избежать этих ограничений, можно пользоваться кучей — она позволяет создавать динамические и глобальные переменные — но управлять памятью должен либо сборщик мусора, либо сам программист, да и работает куча медленнее. tproger(c)
Сборка персонального компьютера от Artline: умный выбор для современных пользователей