Что такое ошибка сегментации?

Вы можете «перезагрузить» CSV-итератор, сбросив позицию чтения файлового объекта.

data = open("googlel.csv", "rb")
orig = csv.reader(data, delimiter = ';')
goodrows = []
for feed in gotfeeds:    
   for link,comments in feed.items():
       data.seek(0)
       for row in orig:
           print link
           if link in row[1]:
               row.append(comments)
               goodrows.append(row)
514
задан Jonathan Leffler 1 June 2016 в 02:40
поделиться

5 ответов

Ошибка сегментации - это ошибка особого типа, вызванная доступом к памяти, которая «не принадлежит вам». Это вспомогательный механизм, который не дает вам повредить память и внести трудно поддающиеся отладке ошибки памяти. Всякий раз, когда вы получаете segfault, вы знаете, что делаете что-то не так с памятью - доступ к переменной, которая уже была освобождена, запись в часть памяти, доступную только для чтения, и т.д. управление памятью, принципиальной разницы между segfaults в C и C ++ нет.

Есть много способов получить segfault, по крайней мере, в языках нижнего уровня, таких как C (++). Обычный способ получить segfault - разыменовать нулевой указатель:

int *p = NULL;
*p = 1;

Другой segfault происходит, когда вы пытаетесь записать в часть памяти, которая была помечена как доступная только для чтения:

char *str = "Foo"; // Compiler marks the constant string as read-only
*str = 'b'; // Which means this is illegal and results in a segfault

Висячий указатель указывает на то, что не работает существуют больше, как здесь:

char *p = NULL;
{
    char c;
    p = &c;
}
// Now p is dangling

Указатель p болтается, потому что он указывает на символьную переменную c , которая перестала существовать после завершения блока. И когда вы попытаетесь разыменовать висящий указатель (например, * p = 'A' ), вы, вероятно, получите segfault.

619
ответ дан 22 November 2019 в 22:27
поделиться

Существует достаточно определений отказа сегментации, я хотел бы заключить в кавычки немного примеров, с которыми я столкнулся при программировании, который мог бы казаться глупыми ошибками, но потратит впустую много времени.

  1. можно вложить отказ сегментации ниже случая, в то время как несоответствие типов аргумента в printf

    #include<stdio.h> int main(){
    int a = 5; printf("%s",a); return 0; }

производило: Segmentation Fault (SIGSEGV)

  1. , когда Вы забыли выделять память указателю, но пытающийся использовать его.

     #include<stdio.h> 
     typedef struct{
       int a;
     }myStruct;   
    int main(){
      myStruct *s;
      /* few lines of code */
      s->a = 5;
      return 0;
    }
    

вывод: Segmentation Fault (SIGSEGV)

1
ответ дан 22 November 2019 в 22:27
поделиться

Ошибка сегментации вызвана запросом страницы, которая не указана процессом в таблице дескрипторов, или недопустимым запросом страницы, которая указана в списке (например, запрос записи на странице, доступной только для чтения). .

Висячий указатель - это указатель, который может указывать или не указывать на действительную страницу, но указывает на «неожиданный» сегмент памяти.

34
ответ дан 22 November 2019 в 22:27
поделиться

Согласно википедии:

Ошибка сегментации возникает, когда программа пытается получить доступ к месту в памяти , которое она не разрешен доступ к или пытается получить доступ к месту в памяти способом, который не разрешен (например, попытка записи в чтение -только местоположение, или чтобы перезаписать часть операционной системы).

15
ответ дан 22 November 2019 в 22:27
поделиться

Если честно, как уже упоминалось на других плакатах, в Википедии есть очень хорошая статья об этом , так что загляните туда. Этот тип ошибки очень распространен и часто называется другими вещами, такими как нарушение доступа или общая ошибка защиты.

Они ничем не отличаются в C, C ++ или любом другом языке, допускающем указатели. Ошибки такого типа обычно вызываются указателями, которые

  1. Используются перед правильной инициализацией
  2. Используются после того, как память, на которую они указывают, была повторно заблокирована или удалена.
  3. Используется в индексированном массиве, где индекс находится за пределами массива. Обычно это происходит только тогда, когда вы выполняете математику указателя на традиционных массивах или c-строках, а не на коллекциях на основе STL / Boost (в C ++).
28
ответ дан 22 November 2019 в 22:27
поделиться