int *nums = {5, 2, 1, 4};
printf("%d\n", nums[0]);
вызывает segfault, тогда как
int nums[] = {5, 2, 1, 4};
printf("%d\n", nums[0]);
нет. Сейчас:
int *nums = {5, 2, 1, 4};
printf("%d\n", nums);
печатает 5.
Исходя из этого, я предположил, что нотация инициализации массива {}, слепо загружает эти данные в любую переменную слева. Когда это int [], массив заполняется по желанию. Когда это int *, указатель заполняется на 5, а ячейки памяти после того, где хранится указатель, заполняются 2, 1 и 4. Таким образом, nums [0] пытается выполнить разделение 5, вызывая segfault.
Если я ошибаюсь, пожалуйста, поправьте меня. И если я прав, пожалуйста, уточните, потому что я не понимаю, почему инициализаторы массивов работают так, как они делают.