Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Ошибка сегментирования  (Прочитано 3905 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ext4

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Ошибка сегментирования
« : 14 Января 2012, 12:52:06 »
Добрый день люди добрые!
Пишу программ на си используя gcc в убунте. В программе реализовал сортировку на основе алгоритма двухпутевого слияния. Программа компилируется отлично, без сучка без задоринки, но при запуске отображается ошибка: ошибка сегментирования. Ругается на место с указателем. Вот алгоритм сортировки. Подскажите пожалуйста в какую сторону копать, и может быть что Ubuntu защищает память от изменения в этом случаи?

Код: (php) [Выделить]
void qs(char *items, int left, int right)
{
  register int i, j;
  char x, y;
  i = left; j = right;
  x = items[(left+right)/2]; /* выбор компаранда */
 
  do {
    while((items[i] < x) && (i < right)) i++;//1
    while((x < items[j]) && (j > left)) j--;//3

   
if(i <= j) {
      y = items[i];
      items[i] = items[j]; // в этом самом месте ошибка!
      items[j] = y; // здесь то же самое
      i++; j--;
    }
  } while(i <= j);

  if(left < j) qs(items, left, j);
  if(i < right) qs(items, i, right);
  printf("%s \n",items);
}

qs("fedacb", 0, 5);

andrey_p

  • Гость
Re: Ошибка сегментирования
« Ответ #1 : 14 Января 2012, 13:04:00 »
Вот даже смотреть на код не стал, сразу скажу, что ошибка "+1" - выход за пределы массива на единицу. Нужно прогнать пошагово через gdb (естественно надо немного потратить времени на обучение) и сразу все станет ясно. Или старым добрым способом - раскидать вывод значений переменных по коду.

ЗЫ Попробуй while (i < j)

Оффлайн ext4

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #2 : 14 Января 2012, 13:31:45 »
Спасибо за ответ. Попробовал как вы сказали поставить выполнять пока: while(i < j);
Скомпилировал, запустил, результат: Ошибка сегментирования (core dumped)
Я пробовал и без цикла, результат тот же. Простое выполнение такого рода:
Код: (php) [Выделить]
char *items;
items = "fedacb";
items[1] = items[2];

Даёт ошибку.


andrey_p

  • Гость
Re: Ошибка сегментирования
« Ответ #3 : 14 Января 2012, 13:36:18 »
Пардон. Был неправ. GCC компилирует строки в область памяти "только для чтения". Надо объявить массив в main, и инициализировать его строкой, и передавать в функцию указатель на этот массив.

char items[] = "fedacb";
ЗЫ Мда, желательно все-таки смотреть на код.  :)
« Последнее редактирование: 14 Января 2012, 13:42:25 от andrey_p »

Оффлайн ext4

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #4 : 14 Января 2012, 14:09:37 »
Надо объявить массив в main, и инициализировать его строкой, и передавать в функцию указатель на этот массив.

char items[] = "fedacb";

что то я не справился с такой задачей.
error: ‘items’ redeclared as different kind of symbol

можно простой примерчик где нужно инициализировать строку?

Написал строку char items[] = "fedacb"; в main(), после запуска ошибка сегментирования. Может я не так что то понял.
 
« Последнее редактирование: 14 Января 2012, 14:22:22 от ext4 »

andrey_p

  • Гость
Re: Ошибка сегментирования
« Ответ #5 : 14 Января 2012, 14:23:56 »
#include <stdio.h>

void hello(char* who)
{
    printf("hello, %s\n", who);
}

int main()
{
    char s[] = "me";
    hello(s);

    return 0;
}
===
В С для начинающих, могут быть непонятности где и как использовать и чем отличаются массивы, указатели на массивы, массивы символов и литеральные строки. Ничего там сложного нет, но надо потратить некоторое время, поразбираться. Я в свое время, как и советовал, писал простые программки и гонял их пошагово через отладчик, смотрел что, где, как происходит.
« Последнее редактирование: 14 Января 2012, 14:31:24 от andrey_p »

Оффлайн ext4

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #6 : 14 Января 2012, 14:37:48 »
andrey_p,
Спасибо огромное! Работает программулька!

 

Страница сгенерирована за 0.029 секунд. Запросов: 25.