Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 17.08.2017
Сообщений: 13

Почему возникает ошибка segmentation fault? В моей программе?

17.08.2017, 20:01. Показов 3155. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В детстве делал игру на паскале. теперь переписываю на си. Все начиналось хорошо. Пока не появилась ошибка.
Помогите пожалуйста!!!
текст программы
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
#include<stdio.h>
#include<stdlib.h>
int i, i1, g, g1;
g = 1;
g1 = 1;
char key;
char place[9][9] ={"L"};
char buff[1];
char player =   '@';
int v_place(int vplace){
    for(i =1;i !=8;i++)
    {
        for(i1 = 1;i1 !=8;i1++)
    {
        putchar(place[i][i1]);
    }
    puts("");
    }
    return 0;
}
 
int controlxy(int cxy)
{
scanf(key);
    switch(key){
    case 'w': {
        place[g][g1] =  '$';
        place[g][g1+1]  =   player;
        g1+=1;
        break;
    }
        case 's': {
        place[g][g1] =  '$';
        place[g][g1-1]  =   player;
        g1-=1;
        break;
        }
        case 'a': {
        place[g][g1] =  '$';
        place[g-1][g1]  =   player;
        g-=1;
        break;
        }
        case 'd': {
        place[g][g1] =  '$';
        place[g+1][g1]  =   player;
        g+=1;
        break;
        }
        break;
    }
        v_place(1);
        return 0;
    }
 
 
    int main(void){
        
        for(i =1;i !=8;i++)
    {
        for(i1 = 1;i1 !=8;i1++)
    {
        place[i][i1]='l';
    }
    }
        
        controlxy(1);
        controlxy(1);
        controlxy(1);
        return 0;
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.08.2017, 20:01
Ответы с готовыми решениями:

При получения пакета возникает ошибка "Segmentation Fault"
Добрый день! Учился отправлять структуру по сети, натолкнулся на глюк. Если комментирую/удаляю выделенные комментариями строчки, после...

В приведенном коде возникает ошибка "segmentation fault"
#include &lt;stdio.h&gt; int mas; int main(){ int i,j,k; for(i=0;i&lt;10;++i) scanf(&quot;%d&quot;,mas); return 0; }

Почему Program received signal SIGSEGV, Segmentation fault. ?
#include &lt;iostream&gt; #include &quot;Tree.hpp&quot; using namespace std; int main() { element *head; Add(head,...

12
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
17.08.2017, 21:16
Не понял, что программа делает.

Но так в C нельзя.

C
1
2
3
int i, i1, g, g1;
g = 1;
g1 = 1;
Странно, что это вообще странслировалось, т.к. это присваивание вне функции, в глобальном пространстве. Операторы и вычисления в глобальном пространстве невозможны.
Должно быть, например, так.

C
1
int i, i1, g = 1, g1 = 1;
Это грубая ошибка.

C
1
scanf(key);
Функции scanf передаётся указатель на строку, содержащую формат, а потом уже указатели на переменные, в которые должно быть произведено считывание. А тут вместо строки функции scanf передано значение типа char.

Должно быть

C
1
scanf("%c", &key);
или даже лучше и проще

C
1
key = getchar();
Следующее...
Вообще-то в Си элементы массива всегда нумеруются с нуля. Т. е. если задан массив int a[9], допустимые номера для его элементов — a[0], a[1], a[2], ...a[8]. Первый элемент имеет номер 0, последний элемент имеет номер 8. Для двумерных массивов, которые в C на самом деле являются массивами массивов, аналогично для char place[9][9] элементы нумеруются так

C
1
2
3
4
5
6
place[0][0], place[0][1], ... place[0][8],
place[1][0], place[1][1], ... place[1][8],
   ..............................................
   ..............................................
   ..............................................
place[8][0], place[8][1], ... place[8][8].
Непонятно, почему в цикле у вас этот массив забивается единичками только для элементов с индексами i и j от 1 до 7. Может, таков замысел вашей программы, а может, вы не разобрались с нумерацией элементов массивов в C.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
17.08.2017, 21:17
24 строка что должна делать, можно прокомментировать?

P.S. Как всегда, не даем думать ТС-у, вываливаем ответы сразу. А потом удивляемся, "что такое, почему они не думают сами?"
2
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
17.08.2017, 21:19
ppssppnt, ppssppnt, вот, такой вариант у меня компилируется:
Кликните здесь для просмотра всего текста

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
#include<stdio.h>
#include<stdlib.h>
int i, i1, g, g1;
g = 1;
g1 = 1;
char key;
char place[9][9] = {"L"};
char buff[1];
char player =   '@';
int v_place(int vplace) {
    for(i =1; i !=8; i++)
    {
        for(i1 = 1; i1 !=8; i1++)
        {
            putchar(place[i][i1]);
        }
        puts("");
    }
    return 0;
}
 
int controlxy(int cxy)
{
    scanf("%c", &key);
    switch(key) {
    case 'w': {
        place[g][g1] =  '$';
        place[g][g1+1]  =   player;
        g1+=1;
        break;
    }
    case 's': {
        place[g][g1] =  '$';
        place[g][g1-1]  =   player;
        g1-=1;
        break;
    }
    case 'a': {
        place[g][g1] =  '$';
        place[g-1][g1]  =   player;
        g-=1;
        break;
    }
    case 'd': {
        place[g][g1] =  '$';
        place[g+1][g1]  =   player;
        g+=1;
        break;
    }
    break;
    }
    v_place(1);
    return 0;
}
 
 
int main(void) {
 
    for(i =1; i !=8; i++)
    {
        for(i1 = 1; i1 !=8; i1++)
        {
            place[i][i1]='l';
        }
    }
 
    controlxy(1);
    controlxy(1);
    controlxy(1);
    return 0;
}


Кликните здесь для просмотра всего текста

Bash
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
debian:~/trash/c$ 
Thread model: posix
gcc version 4.9.2 (Debian 4.9.2-10) 
debian:~/trash/c$ gcc -o run-app app.c
app.c:4:1: warning: data definition has no type or storage class
 g = 1;
 ^
app.c:5:1: warning: data definition has no type or storage class
 g1 = 1;
 ^
debian:~/trash/c$ ls
run-app app.c app.c~
debian:~/trash/c$./run-app
w
$@lllll
lllllll
lllllll
lllllll
lllllll
lllllll
lllllll
$@lllll
lllllll
lllllll
lllllll
lllllll
lllllll
lllllll
s
@$lllll
lllllll
lllllll
lllllll
lllllll
lllllll
lllllll
debian:~/trash/c$
1
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
17.08.2017, 21:25
Попробуйте такой исправленный вариант. Хотя не факт, что это будет нормально работать. С алгоритмом вашей программы я совсем не разбирался.

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
73
#include<stdio.h>
#include<stdlib.h>
 
 
int i, i1, g = 1, g1 = 1;
char key;
char place[9][9] ={"L"};
char buff[1];
char player =   '@';
 
 
int v_place(int vplace){
    for(i =1;i !=8;i++)
    {
        for(i1 = 1;i1 !=8;i1++)
    {
        putchar(place[i][i1]);
    }
    puts("");
    }
    return 0;
}
 
int controlxy(int cxy)
{
key = getchar();
    switch(key){
    case 'w': {
        place[g][g1] =  '$';
        place[g][g1+1]  =   player;
        g1+=1;
        break;
    }
        case 's': {
        place[g][g1] =  '$';
        place[g][g1-1]  =   player;
        g1-=1;
        break;
        }
        case 'a': {
        place[g][g1] =  '$';
        place[g-1][g1]  =   player;
        g-=1;
        break;
        }
        case 'd': {
        place[g][g1] =  '$';
        place[g+1][g1]  =   player;
        g+=1;
        break;
        }
        break;
    }
        v_place(1);
        return 0;
    }
 
 
    int main(void){
        
        for(i =1;i !=8;i++)
    {
        for(i1 = 1;i1 !=8;i1++)
    {
        place[i][i1]='l';
    }
    }
        
        controlxy(1);
        controlxy(1);
        controlxy(1);
        return 0;
    }
Ну и читайте книгу Кернигана и Ритчи. Лучший учебник для начала освоения C. И помните, что C язык низкоуровневый, полумашинный, немножко близкий к ассемблеру. За каждой его конструкцией стоит что-то от самой машины.
1
0 / 0 / 0
Регистрация: 17.08.2017
Сообщений: 13
17.08.2017, 22:25  [ТС]
Благодарю за советы исправил прогу!!!


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
#include<stdio.h>
#include<stdlib.h>
int i, i1, g = 1, g1 = 1
char key;
char place[9][9] ={"L"};
char buff;
char player =   '@';
 
void clrscr(void) { char a[80]; printf("\033[2J");
 printf("\033[0;0f");
}
 
int v_place(int vplace){
    if (vplace=1){
    for(i =1;i !=8;i++)
    {
        for(i1 = 1;i1 !=8;i1++)
    {
        putchar(place[i][i1]);
    }
    puts("");
    }
    return 0;
}
}
 
int controlxy(int cxy)
{
clrscr();
        switch(key){
    case 'd': {
        place[g][g1] =  '$';
        place[g][g1+1]  =   player;
        g1+=1;
        break;
    }
        case 'a': {
        place[g][g1] =  '$';
        place[g][g1-1]  =   player;
        g1-=1;
        break;
        }
        case 'w': {
        place[g][g1] =  '$';
        place[g-1][g1]  =   player;
        g-=1;
        break;
        }
        case 's': {
        place[g][g1] =  '$';
        place[g+1][g1]  =   player;
        g+=1;
        break;
        }
    
    }
        v_place(1);
        return 0;
    }
 
 
    int main(void){
        
        for(i =1;i !=8;i++)
    {
        for(i1 = 1;i1 !=8;i1++)
    {
        place
Добавлено через 5 минут
массив place это игровое поле
с помощью switch осуществляться управление.
завтра увеличу поле добавлю монеты на поле и буду раскрашивать.
это моя первая программа на си !!!
ну как?

Добавлено через 10 минут
Благодарю за советы исправил прогу!!!


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
73
74
75
76
77
78
79
80
81
#include<stdio.h>
#include<stdlib.h>
int i, i1, g, g1;
g = 1;
g1 = 1;
char key;
char place[9][9] ={"L"};
char buff;
char player =   '@';
 
void clrscr(void) { char a[80]; printf("\033[2J");
 printf("\033[0;0f");
}
 
int v_place(int vplace){
    if (vplace=1){
    for(i =1;i !=8;i++)
    {
        for(i1 = 1;i1 !=8;i1++)
    {
        putchar(place[i][i1]);
    }
    puts("");
    }
    return 0;
}
}
 
int controlxy(int cxy)
{
clrscr();
        switch(key){
    case 'd': {
        place[g][g1] =  '$';
        place[g][g1+1]  =   player;
        g1+=1;
        break;
    }
        case 'a': {
        place[g][g1] =  '$';
        place[g][g1-1]  =   player;
        g1-=1;
        break;
        }
        case 'w': {
        place[g][g1] =  '$';
        place[g-1][g1]  =   player;
        g-=1;
        break;
        }
        case 's': {
        place[g][g1] =  '$';
        place[g+1][g1]  =   player;
        g+=1;
        break;
        }
    
    }
        v_place(1);
        return 0;
    }
 
 
    int main(void){
        
        for(i =1;i !=8;i++)
    {
        for(i1 = 1;i1 !=8;i1++)
    {
        place[i][i1]='l';
    }
    }
while(key != 'q'){
    key =   getchar();
    controlxy(1);
}
        getchar();
        return 0;
 
        exit;
    }
Добавлено через 5 минут
массив place это игровое поле
с помощью switch осуществляться управление.
завтра увеличу поле добавлю монеты на поле и буду раскрашивать.
это моя первая программа на си !!!
ну как?
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
18.08.2017, 15:57
Цитата Сообщение от JohnyWalker Посмотреть сообщение
т.к. это присваивание вне функции, в глобальном пространстве. Операторы и вычисления в глобальном пространстве невозможны.
Тук-тук? У вас свой собственный стандарт?

Цитата Сообщение от JohnyWalker Посмотреть сообщение
Лучший учебник для начала освоения C.
Серьезно? Прямо лучший для освоения? Боже мой.

Добавлено через 35 секунд
Цитата Сообщение от ppssppnt Посмотреть сообщение
это моя первая программа на си !!!
ну как?
Как и все первые программы на С.
1.50
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
18.08.2017, 16:30
Цитата Сообщение от Вованя Посмотреть сообщение
Тук-тук? У вас свой собственный стандарт?
Ну так объясни, умник, что по-твоему значит конструкция

C
1
2
3
int i, i1, g, g1;
g = 1;
g1 = 1;
в глобальном пространстве.

Ни одной такой программы не видел ни разу. Может, стандарт и допускает такое, но мне не попадалось.

А по поводу учебника Кернигана и Ритчи - мой первый учебник, по которому познакомился с этим языком. Изложено кратко, сжато, но внятно и красиво. Некоторых тонкостей в нём нет, конечно. Материал не разжёвывается для уровня идиота. Зато донесён очень доходчиво.
0.50
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
21.08.2017, 16:53
Цитата Сообщение от JohnyWalker Посмотреть сообщение
Ну так объясни, ... что ... значит конструкция ... в глобальном пространстве.
Объявление в сегменте данных переменных типа int с именами i, i1, g, g1.
Инициализация переменной g значением 1, переменной g1 значением 1.

Добавлено через 4 минуты
На самом деле для компилятора оно в этом случае:
C
1
2
3
int i, i1, g, g1;
int g=1;
int g1=1;
1
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
24.08.2017, 03:13
Цитата Сообщение от bormant Посмотреть сообщение
Объявление в сегменте данных переменных типа int с именами i, i1, g, g1.
Инициализация переменной g значением 1, переменной g1 значением 1.
Ну, понятно. Т. е. это форма записи инициализации глобальной переменной.

На самом деле для компилятора оно в этом случае:
C
1
2
3
int i, i1, g, g1;
int g=1;
int g1=1;
Странно, почему в этом случае компилятор не воспринимает эту запись как повторное объявление переменной g и g1 два раза. Ведь по сути дела сначала у нас стоит запись
C
1
int g;
т. е. объявление переменной без инициализации, а после неё встречается запись
C
1
int g=1;
т. е. объявление той же переменной, но уже с инициализацией. Казалось бы, это повторное объявление целочисленной переменной с одним и тем же именем. Но компилятор gcc эту запись воспринял нормально, не выдав ни ошибки, ни предупреждения.

Кстати, запись вида

C
1
2
3
int i, i1, g, g1;
int g=1;
int g1=1;
gcc скомпилировал, но выдал предупреждения (warnings) такого вида - "data definition has no type or warning class". Компилятор Visual Studio 2010, напротив, в этой записи не увидел ничего зазорного и скомпилировал её без ошибок.

Как вы можете обе эти формы инициализации глобальной переменной, а именно,

1.
C
1
2
int a;
a=1;
2.
C
1
2
int a;
int a=1;
объяснить с точки зрения грамматики языка C и, возможно, его стандарта? Когда возможность такой записи появилась в языке? Была ли она в нём сразу или это позднейшее нововведение, которое было отражено лишь в поздних версиях стандарта (например, в C99). Просто я такой формы инициализации глобальных переменных не встречал до этого ни в одной программе и ни в одном учебнике. Поэтому я и прошу разъяснить, что это за форма инициализации, а ещё лучше дать ссылки на источники, где этот вопрос рассмотрен.
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
25.08.2017, 12:28
JohnyWalker, это могу сделать я. И первая и вторая формы подчиняются разделу J.5.11 Multiple external definitions стандарта С11 (может и ранее есть -- не проверял). Обе не имеют под собой неопределенного поведения ибо представляют собой две декларации, но только одну инициализацию. При этом стоит понимать, что все что упоминается в 5м разделе этого дополнения стандарта -- расширения. То есть не строго conformant фишки с т.з. языка, но те с чем можно стандарт разрешает жить.
3
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
25.08.2017, 15:24
HighPredator, спасибо! Доходчиво объяснил и со ссылкой!
1
0 / 0 / 0
Регистрация: 17.08.2017
Сообщений: 13
22.10.2018, 00:21  [ТС]
всем спасибо тема закрыта!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2018, 00:21
Помогаю со студенческими работами здесь

Segmentation fault(core dumped) в программе поиска одинаковых файлов в 2-х каталогах и их подкаталогах
Здравствуйте, сейчас делал задание, суть которого в том, чтобы в двух каталогах и их подкаталогах найти элементы с одинаковым содержанием и...

Ошибка Segmentation fault (11)
Всем привет! Сложилась такая ситуация что под виндой все прекрасно работает, а когда запускаю приложение на девайсе под андроидом...

Ошибка Segmentation Fault
При соединении сигнала QNetworkReply::finished или ReadyRead с любым слотом(даже пустым) вылетает ошибка Segmentation Fault. Если...

Ошибка Segmentation fault
Всем доброго дня. Люди добрые, помогите, кто чем может. При вызове метода hand.dealToPlayers(0) или hand.dealToPlayers(1) ошибок нет,...

Ошибка Segmentation fault: 11
Приветствую! В данный момент пишу дипломную работу, хочу вызывать из Java c помощью JNI API данный ассемблерный код: Опыт ассемблера не...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru