Может показаться нормально работающим , но это совсем не безопасно.Записывая данные за пределы выделенного блока памяти, вы перезаписываете некоторые данные, которые не следует делать.Это одна из самых серьезных причин ошибок в работе сегмента и других ошибок памяти, и то, что вы наблюдаете, когда вы работаете в этой короткой программе, так затрудняет поиск основной причины.
Чтение эта статья , в частности, часть о повреждении памяти, чтобы начать понимать проблему.
Valgrind является отличным инструментом для анализа ошибок памяти, таких как та, которую вы предоставляете.
@ Дэвид сделал хороший комментарий.Сравните результаты выполнения вашего кода с выполнением следующего кода .Обратите внимание, что последнее приводит к ошибке во время выполнения (практически без полезного вывода!) На ideone.com (переход по ссылкам), тогда как первый завершается успешно, как вы видели.
main()
{
int *p;
p=malloc(sizeof(int));
printf("size of p=%d\n",sizeof(p));
p[500]=999999;
printf("p[0]=%d",p[500]);
p[500000]=42;
printf("p[0]=%d",p[500000]);
return 0;
}