Ошибка сегментации в маленькой программе на С - PullRequest
4 голосов
/ 03 августа 2011

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

*total = a;

Проблема в самом начале кода.Вот оно:

main(){
  int a[] = {1,1,1,0,0,0,0};
  int **total; //array of int arrays
  *total = a; //i.e. set total's first array to be a.

Я новичок в Си и указатели.Любая помощь будет оценена.

Ответы [ 5 ]

5 голосов
/ 03 августа 2011

total указывает на указатель p, который указывает на int.Присваивая *total, вы назначаете p.Но total не был инициализирован, поэтому вы присваиваете значение случайному местуВам нужно инициализировать total - например

int * p;
int** total = &p;
4 голосов
/ 03 августа 2011

Вы получаете segfault, потому что total неинициализирован и поэтому *total указывает на случайный пробел в памяти.Вы хотите выделить место для итогов:

total = malloc(sizeof (int *) * NUM_ARRAYS);

В качестве альтернативы, вы можете игнорировать указатели и создать общий массив:

int *total[NUM_ARRAYS];

Понизить массивы total указывает на указателиих первые элементы, и вы можете использовать его следующим образом:

total[0] = a;

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

2 голосов
/ 04 февраля 2012

Код не всегда должен давать вам ошибку сегментации.Когда вы объявляете

     int *p

sizeof (int *) биты выделяются для p. (Это 32 в случае 32-битного компилятора.) P должен указывать на то, что хранится в выделенном пространстве.,Теперь, когда вы не инициализировали это значение.Так что это может содержать некоторую случайную величину.Когда вы делаете

    *p=10 //say

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

0 голосов
/ 03 августа 2011

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

0 голосов
/ 03 августа 2011

Вы не выделили никакой памяти для total.При total неинициализированном присвоение *total вызывает неопределенное поведение.К счастью, у вас есть ошибка.Пока вы выделяете память для total (или просто используете массив указателей, как я полагаю, это ваше намерение), все будет работать нормально.

...