Существует хорошая статья, которая объясняет, как представить те же данные различными шаблонами http://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-django
, все еще необходимо автоматически перенаправить пользователя на мобильный сайт однако, и это может быть сделано с помощью нескольких методов (прием check_mobile будет работать также)
Википедия , наряду с рядом других источников, дает ответ.
Ошибка сегментации означает, что вы сделали что-то плохое с указателями. Вероятно, это ошибка сегмента:
char *c = NULL;
...
*c; // dereferencing a NULL pointer
Или это:
char *c = "Hello";
...
c[10] = 'z'; // out of bounds, or in this case, writing into read-only memory
Или, может быть, следующее:
char *c = new char[10];
...
delete [] c;
...
c[2] = 'z'; // accessing freed memory
Один и тот же основной принцип в каждом случае - вы делаете что-то с памятью, которая не принадлежит вам.
Существуют различные причины ошибок сегментации, но, по сути, вы неправильно обращаетесь к памяти. Это может быть вызвано разыменованием нулевого указателя или попыткой изменить память только для чтения, или использованием указателя на место, которое не отображается в пространстве памяти вашего процесса (это, вероятно, означает, что вы пытаетесь использовать число в качестве указателя , или вы слишком сильно увеличили указатель). На некоторых машинах смещение доступа через указатель также может вызвать проблему - например, если у вас есть нечетный адрес и вы пытаетесь прочитать четное число байтов из него (вместо этого может генерироваться SIGBUS).
Вот пример SIGSEGV.
root@pierr-desktop:/opt/playGround# cat test.c
int main()
{
int * p ;
* p = 0x1234;
return 0 ;
}
root@pierr-desktop:/opt/playGround# g++ -o test test.c
root@pierr-desktop:/opt/playGround# ./test
Segmentation fault
А вот деталь .
Как с этим справиться?
По возможности избегайте этого в то первое место.
Программируйте защитно: используйте assert (), проверьте указатель NULL, проверьте переполнение буфера.
Используйте инструменты статического анализа для проверки вашего кода.
скомпилируйте ваш код с -Werror -Wall.
] Кто-нибудь проверяет ваш код.
Когда это на самом деле произошло.
Внимательно изучите ваш код.
Проверьте, что вы изменили с момента последнего успешного выполнения кода без сбоев.
Надеюсь, gdb предоставит вам стек вызовов, чтобы вы знали, где произошел сбой.
EDIT: извините за спешку. Это должно быть * p = 0x1234;
вместо p = 0x1234
;
с использованием недопустимого / нулевого указателя? Выход за границы массива? Трудно быть конкретным без какого-либо образца кода.
По сути, вы пытаетесь получить доступ к памяти, которая не принадлежит вашей программе, поэтому ОС убивает ее.