Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/20: Рейтинг темы: голосов - 20, средняя оценка - 4.60
8 / 7 / 3
Регистрация: 03.01.2009
Сообщений: 70

Во время компиляции этой программы выдается ошибка сегментирования

22.12.2010, 15:29. Показов 4205. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Вот эта программа работает нормально.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
    {
         
        char c;
        char *str[10];
        int i;
        
        //открываем файлы
        FILE *sh;
        sh=fopen("shtuk.txt","rt");
        
        fscanf(sh,"%c",&c);
        i=0;
        while(c!=':')
        {
            str[i]=&c;
            printf("%c",*str[i]); i++;
            fscanf(sh,"%c",&c);
        };
        
        
        fclose(sh);
        return 0;
    }
А во время компиляции этой программы выдается ошибка сегментирования.
Здесь, если не использовать функцию moika() (строка 45), то она тоже работает. Значит ошибка в этой функции. С другой стороны, код который я написал выше абсолютно идентичен функции moika() и работает. Помогите разобраться.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <string.h>
#include <errno.h>
void moika();
int main(int argc, char *argv[],char *envp[])
{
    int *plate;       //разделяемая память
    int shmid;        //IPC дескриптор для разделяемой памяти
    key_t key;        //IPC ключ
    char path[]="time.txt";  //имя файла для генерации ключа
    char string[5];   //строка, содержащая число N
    int i=0;          //просто счётчик 
    int n;            //вместимость стола 
    
    if(argc!=2) { printf("We need more information."); exit(-1);};
    
    //получаем число N - вместимость стола
    char *j=argv[1];
    
    //записываем число в string
    while( *j!='\0' )
    {
        string[i]=*j;
        j++; i++; 
    };
    
    //преобразуем строку в тип integer
    n=atoi(string);   
    printf("%d",n);
    //генерируем ключ 
    if( (key=ftok(path,0))<0 ) { printf("\n Can't generate key."); exit(-1);};
    
    //получаем дескриптор
    if( (shmid=shmget(key,10*sizeof(int),0666 /*| IPC_CREAT | IPC_EXCL*/))<0 ) 
        { printf("\n Can't create shared memory.\n"); exit(-1);};
        
    if( (plate=shmat(shmid,NULL,0))<0 ) { printf("\n Can't attach shared memory.\n"); exit(-1);};
    
    plate[0]=n;//первый элемент массива указыает на количество свободного места на столе
 printf("%d",n);
    moika();
        return 0;
}   
    
    void moika()
    {
         
        char c;
        char str_shtuk[5];
        char str_type[5];
        char *str[10];
        int i;
        int shtuk=0,type;
        int buf;
        //открываем файлы
        FILE *sh;
        sh=fopen("shtuk.txt","rt");
   
        fscanf(sh,"%c",&c);
        i=0;
        while(c!=':')
        {
            str[i]=&c;
            i+=1;
            fscanf(sh,"%c",&c);
        };
        printf("%c",c);
    };
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.12.2010, 15:29
Ответы с готовыми решениями:

При компиляции программы выдается ошибка
&quot;Сan't locate file: windows.inc&quot; что это значит? и как исправить???? (компилятор TASM 5.0) Добавлено через 2 часа 1 минуту 43 секунды ...

Ошибка сегментирования при компиляции
Когда компилирую через g++ компилируется, при запуске выдает ошибку сегментирования, а при компиляции через NetBeans IDE выдает две ошибки,...

При компиляции выдается ошибка
import java.lang.String; import java.util.Scanner; class Building{ String quality; String speed; public...

22
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.12.2010, 15:37
Не понятно, для чего вообще нужен str, если все его значения будут указывать на один и тот же адрес, не понятно почему он размером 10, а цикл while не ограничен, не понятно, для чего нужен i, если он не используется.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 15:45
Во-первых, напиши четко, что должна делать программа.
Во-вторых, что за режим открытия - "rt"?
В-третьих, нужно проверять, удалось ли связать файл с потоком (т.е. открыть)

Цитата Сообщение от Vourhey Посмотреть сообщение
Не понятно, для чего вообще нужен str, если все его значения будут указывать на один и тот же адрес, не понятно почему он размером 10, а цикл while не ограничен, не понятно, для чего нужен i, если он не используется.
Ну почему же не ограничен - пока прочтенный из файла символ не окажется символом ':'. Ну а i просто счетчик. А вот с str действительно непонятно...
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.12.2010, 15:49
Цитата Сообщение от Nameless One Посмотреть сообщение
Ну почему же не ограничен - пока прочтенный из файла символ не окажется символом ':'
str[10] объявлен. Если символ ":" будет 500-ым, то это приведет к корапту памяти на стеке и segmentation fault в лучшем случае. Поэтому, нет, он не ограничен так, как он должен быть
Цитата Сообщение от Nameless One Посмотреть сообщение
Ну а i просто счетчик.
Спасибо, КЭП просто код и так разбухший, можно было бы заюзать адресную арифметику, он бы стал куда более красивым и понятным.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 15:54
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от Vourhey Посмотреть сообщение
Если символ ":" будет 500-ым, то это приведет к корапту памяти на стеке и segmentation fault в лучшем случае.
Ну это естественно. Как я думаю, содержимое файла таково, что этот символ обязательно должен встретиться раньше, иначе все действительно плохо

Цитата Сообщение от Nameless One Посмотреть сообщение
Во-вторых, что за режим открытия - "rt"?
И да, скорее всего после вызова fopen у тебя errno равняется EINVAL:
Code
1
2
3
ERRORS
       EINVAL. The  mode  provided  to  fopen(),  fdopen(),  or  freopen()  was
              invalid.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.12.2010, 15:56
Nameless One, тогда непонятно, почему он в первом случае открывается.
0
8 / 7 / 3
Регистрация: 03.01.2009
Сообщений: 70
22.12.2010, 15:58  [ТС]
А почему str будет указывать на один и тот же адрес?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 16:08
Цитата Сообщение от Vourhey Посмотреть сообщение
Nameless One, тогда непонятно, почему он в первом случае открывается.
Мне вот тоже теперь стало непонятно... Запустил программу, которая открывает файл (существующий) с таким режимом, но fopen не возвращает NULL, а errno не установлена в EINVAL. Как я понял, fopen неизвестные символы в строке режима открытия просто игнорирует (пока все известные символы указывают корректный режим).
Но тем не менее, проверки на открытия файлов все равно делать неплохо

Цитата Сообщение от Rasul Посмотреть сообщение
А почему str будет указывать на один и тот же адрес?
Потому что в цикле ты каждый раз присваиваешь str[i] адрес одной и той же переменной.
И да, может просветишь меня уже про режим открытия?
0
8 / 7 / 3
Регистрация: 03.01.2009
Сообщений: 70
22.12.2010, 16:12  [ТС]
А если сделать так?
C++
1
2
3
4
5
6
7
8
char str[10];
char c;
while(c!=':')
        {
            str[i]=c;
            i+=1;
            fscanf(sh,"%c",&c);
        };
А вообще мне нужно строчку записать в массив символов str[10] символу из файла, которые стоят до ":"
Скажите, пожалуйста, как это сделать.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.12.2010, 16:13
Цитата Сообщение от Nameless One Посмотреть сообщение
Но тем не менее, проверки на открытия файлов все равно делать неплохо
Это понятно... Поэтому считаю наболее вероятным все-таки в str переполнение
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 16:13
Rasul, запусти программу в отладчике, сразу найдешь, где у тебя ошибка
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.12.2010, 16:15
Rasul, а если следить за размерами?

Добавлено через 50 секунд
Цитата Сообщение от Nameless One Посмотреть сообщение
запусти программу в отладчике
наилучший метод. Но, боюсь, что тут с отладчиком напряги будут
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 16:20
Цитата Сообщение от Rasul Посмотреть сообщение
А если сделать так?
C++
1
2
3
4
5
6
7
8
char str[10];
char c;
while(c!=':')
        {
            str[i]=c;
            i+=1;
            fscanf(sh,"%c",&c);
        };
А вообще мне нужно строчку записать в массив символов str[10] символу из файла, которые стоят до ":"
Скажите, пожалуйста, как это сделать.
Инициализировать указатель (строку) значением символа - плохо

Добавлено через 3 минуты
Цитата Сообщение от Vourhey Посмотреть сообщение
Но, боюсь, что тут с отладчиком напряги будут
Почему это? Запускаем программу, она падает, пишем "where", смотрим, где именно она падает
0
8 / 7 / 3
Регистрация: 03.01.2009
Сообщений: 70
22.12.2010, 16:21  [ТС]
Переполнения str точно не будет, так как в файле данные типа:
323:3443
3443:3


Nameless One, а что тогда хорошо?

И ещё вопрос: почему после каждого запуска программы всё содержимое файла удаляется?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.12.2010, 16:26
Цитата Сообщение от Nameless One Посмотреть сообщение
Почему это? Запускаем программу, она падает, пишем "where", смотрим, где именно она падает
Чувак, если б он это знал, он бы уже давно сделал.

Добавлено через 2 минуты
Цитата Сообщение от Rasul Посмотреть сообщение
почему после каждого запуска программы всё содержимое файла удаляется?
все-таки попробуй rt на r заменить. И файлы закрывать за собой.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 17:07
Цитата Сообщение от Rasul Посмотреть сообщение
Nameless One, а что тогда хорошо?
Не делать так, как я написал выше.

Как я понял, ты сейчас находишься в одной из *nix систем, тогда скорее всего ты ипользуешь gcc, и отладчик gdb тоже скорее всего присутствует в системе.
Скомпилируй свою программу с ключем -g. Примерно так (пусть у тебя программа называется prog, а исходник - файл main.c):
Bash
1
2
3
4
# Компиляция с введение отладочной информации
gcc -o prog main.c -g
# Запуск отладчика
gdb prog
После запуска отладчика последовательно введи две команды: run и where, и глянь результаты

Добавлено через 31 секунду
Цитата Сообщение от Vourhey Посмотреть сообщение
все-таки попробуй rt на r заменить. И файлы закрывать за собой.
Ну и в дополнение сделать проверку на открытие файлов

Добавлено через 35 минут
Цитата Сообщение от Nameless One Посмотреть сообщение
После запуска отладчика последовательно введи две команды: run и where, и глянь результаты
Ах да, забыл, у тебя же программа запускается с параметрами командной строки. Поэтому запускай ее в отладчике не с помощью команды run, а с помощью команды run argument1 [argument2...]
1
8 / 7 / 3
Регистрация: 03.01.2009
Сообщений: 70
22.12.2010, 17:10  [ТС]
У меня установлена EduMandriva. Компилятор Geany. Отладчика вроде бы нет.
Пишу
C++
1
gdb prog
Он такой команды не находит. А установить то, что вы сказали не получается.
Спасибо за ответы, но всё-таки объясните как можно из файла считать посимвольно строку до символа ":"и записать её в массив символов str.
Так вроде правильно? Но и тут ошибка сегментирования. Причем содержимое файла удалилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void moika()
    {
         
        char c;
        char str[10];
        int i;
        FILE *sh;
        if( (sh=fopen("shtuk.txt","w+")==NULL ) 
        {
            printf("\n Can't open file.");
            exit(-1);
        };  
        
  
        fscanf(sh,"%c",&c);
        i=0;
        while(c!=':')
        {
            str[i]=c;
            i+=1;
            fscanf(sh,"%c",&c);
        };
        printf("%c",c);
    fclose(sh);
    };
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.12.2010, 17:15
Цитата Сообщение от Rasul Посмотреть сообщение
Компилятор Geany
Это расширенный редактор, а не компилятор.
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.12.2010, 17:19
Цитата Сообщение от Rasul Посмотреть сообщение
Компилятор Geany
Geany - это не компилятор, а среда разработки. Своего компилятора у ней нет, она использует установленный в системе. Обычно это как раз-таки Gnu Compiler Collection, gcc. Если тебе еще интересен вариант с отладкой, открой консоль и введи команды whereis gcc, whereis gdb. Ну или используй отладку из Geany, если она там интегрирована.
Цитата Сообщение от Rasul Посмотреть сообщение
Так правильно?
грубая ошибка - ты открываешь файл для записи, при этом его длина усекается до нуля (читай, он полностью очищается). Открываей его в режиме чтения - "r"
1
8 / 7 / 3
Регистрация: 03.01.2009
Сообщений: 70
22.12.2010, 17:30  [ТС]
Ввел whereis gcc
gcc:/usr/bin/gcc4.4-version /usr/bin/gcc /usr/lib/gcc

Ввел whereis gdb
gdb: /usr/share/gdb

Только я не понимаю, а как ими пользоваться?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2010, 17:30
Помогаю со студенческими работами здесь

Подскажите почему выдается ошибка компиляции
#include &lt;iostream&gt; using namespace std; int main() { cout &lt;&lt; &quot;Hello there.\n&quot;; cout &lt;&lt; &quot;Here is 5: &quot; &lt;&lt; 5 &lt;&lt; &quot;\n&quot;; cout...

При компиляции выдается ошибка [Error] 'randomize' was not declared in this scope
Доброго времени суток. Есть код написанный на Си, но при компиляции в DevC++ выдает ошибку 'randomize' was not declared in this scope ...

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

Выдается ошибка при компиляции (error C2447: missing function header (old-style formal list?))
не работает программа, выдает ошибку C:\Program Files\Microsoft Visual Studio\MyProjects\564356765456\cfvb n.cpp(6) : error C2447:...

При запуске программы выдается ошибка
Ребят строго не судите ,так как стал вникать в &quot;языки&quot;совсем недавно . З.Ы. если не правильно создал тему ,прошу не тереть ,а перенести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru