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


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

Автор Тема: C Linux - Ошибка сегментирования (сделан дамп памяти)  (Прочитано 23947 раз)

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

Оффлайн dio4

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
  • Software is like sex: it's better when it's free
    • Просмотр профиля
    • Документация FreeBSD, Linux, Cisco
простенькая учебная прога по подсчету пробельных и прочих символов из учебника Кернигана и Ритчи.

#include <stdio.h>
main ()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; 1 < 10; ++i)
ndigit = 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9' )
++ndigit[ c - '0' ];
else if (c == " " || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf ("цифры =");
for (i = 0; i < 10; ++i)
printf(", символы-разделители = %d, прочие - %d\n", nwhite, nother);
}

компиляция проходит успешно. При запуске выдает "Ошибка сегментирования (сделан дамп памяти)". Собсвенно два вопроса:
1 - что такое здесь (и вообще) ошибка сегментирования и как ее избегать?
2 - куда делается дамп памяти? Я его не нашел (Ubuntu Linux 14.04).
спасибо заранее.
« Последнее редактирование: 19 Января 2015, 16:29:06 от dio4 »

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12139
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Цитировать
int ndigit[10];
nwhite = nother = 0;
for (i = 0; 1 < 10; ++i)
ndigit = 0;

Я могу конечно не знать особенностей языка, но мое глубокое ИМХО что должно быть както так:
int ndigit[10];
nwhite = nother = 0;
for (i = 0; 1 < 10; ++i)
ndigitх[i] = 0;

Кроме того вывод результатов, мягко говоря, криво сделан.
« Последнее редактирование: 19 Января 2015, 17:28:50 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
dio4, ошибка сегментирования - программа полезла в область памяти ей не предназначенную и была завершена.
Рекомендую почитать правила оформления кода(про отступы и скобочки). А вставлять код можно нажав на решетку.(над смайликами)

Пользователь решил продолжить мысль 19 Января 2015, 17:59:53:
разве в си не обязательно писать тип функции?
« Последнее редактирование: 19 Января 2015, 17:59:53 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Delit

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
А разве компилятор на строку
Цитировать
for (i = 0; 1 < 10; ++i)
ни каких предупреждений не выдал?
должно быть
for (i = 0; i < 10; i++)
 ndigit[i] = 0;

for (i = 0; i < 10; ++i)
printf(", символы-разделители = %d, прочие - %d\n", nwhite, nother);
а зачем 10 раз выводить одну и туже строчку?

А это язык с, а то я даже засомневался.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Delit, какое предупреждение? Си позволяет отстрелить себе ногу перед этим наступив на грабли... А то да действительно опечатка. Скобочки ставить не учили?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн dio4

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
  • Software is like sex: it's better when it's free
    • Просмотр профиля
    • Документация FreeBSD, Linux, Cisco
На самом деле все просто  ;D Delit хорошо заметил и я сегодня утром тоже.
единица всегда меньше 10 (тут for (i = 0; 1 < 10; ++i) ) , потому и цикл молотит бесконечно, естественно выходя за границу массива ndigit.
Эта глупая опечатка и ничего более - опечатка в учебнике. Так что, спасибо вам конечно, но ни скобочки и ничего другое тут ни при  чем  ;)
PS Про дамп кто-нибудь скажет или нет что умного?
alsoijw спасибо за напоминание правил добавления кода. Промухал.
« Последнее редактирование: 20 Января 2015, 10:21:09 от dio4 »

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Ошибка сегментации

Код: (C) [Выделить]
#include <stdio.h>

int main ()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i) {
ndigit[i] = 0;
}
while ((c = getchar()) != EOF) {
if (c >= '0' && c <= '9') {
++ndigit[c - '0'];
} else if (c == ' ' || c == '\n' || c == '\t') {
++nwhite;
} else {
++nother;
}
printf("цифры = ");
printf("\n");
for (i = 0; i < 10; ++i) {
printf("%d: %d | ", i, ndigit[i]);
}
printf("\n");
printf(", символы-разделители = %d, прочие - %d\n", nwhite, nother);
}

return 0;
}

Оффлайн dio4

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
  • Software is like sex: it's better when it's free
    • Просмотр профиля
    • Документация FreeBSD, Linux, Cisco
спасибо, но про дамп так и не понял. Где его посмотреть?

Пользователь решил продолжить мысль 21 Января 2015, 12:34:09:
Зависит от значения sysctl kernel.core_pattern. Если кому интересно, то код ниже:[faust@localhost ~]$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e
[faust@localhost ~]$ ls /usr/lib/systemd/systemd-coredump
/usr/lib/systemd/systemd-coredump
[faust@localhost ~]$
« Последнее редактирование: 21 Января 2015, 12:34:09 от dio4 »

 

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