Проще говоря, ошибка сегментации заключается в том, что вы читаете или записываете память, к которой у вас нет доступа, потому что вы ею не владеете.
Простой пример - использование переменной в стеке, за которой следует некоторый код. Скажем, у нас есть
char a[4];
int i=0;
for(i=0; i<1000; ++0)
a[i]='a';
printf("Hi this line will never get printed because last line killed it\n");
Итак, в стеке у нас есть 4 байта, выделенных для «a», еще 4 байта для int «i», и теперь у нас есть код, который является функцией. Дело в том, что оператор for записывает 1000 байтов в «a», который перезаписывает «i», а также уничтожает код, следующий за ним.