Member 13954179 Ответов: 2

Программа получила сигнал SIGSEGV, ошибка сегментации ! ! что это значит и как мне решить эту проблему?


#include<stdio.h>
#include<conio.h>
struct node *head=NULL;
static int count=0;

struct node
{
	int coef;
	int pow;
	struct node *link;
};

void showoff()
{
	struct node *trace;
	trace=head;
	printf("\n");
	printf("it's working!!!!!!!!!!!!!!!!'1");
	while(trace!=NULL)
	{
		printf("|  | |  | |%x|-->",trace->link);
		trace=trace->link;
		printf("it's working!!!!!!!!!!!!!!!!'2");
	}
	printf("it's working!!!!!!!!!!!!!!!!'3");
}

void omega(int degree)
{	
	int i;
	struct node *temp,*t;
	temp=head;
	t=head;

	for(i=0;i<=degree;i++)	
	{
		temp=(struct node*)malloc(sizeof(struct node));
		//printf("temp  it's working!!!!!!!!!!!!!!!!'\n");
		if(count==0)
		{
			temp->link=head;
			head=temp;
			count++;
			//printf("count==0 it's working!!!!!!!!!!!!!!!!'\n");
		}
		else if (count==1)
		{
			temp->link=head->link;
			head->link=temp;
			count++;
			//printf("count==1 it's working!!!!!!!!!!!!!!!!'\n");
		}
		else
		{
			printf("else  it's working!!!!!!!!!!!!!!!!'\n");
			while(t->link!=NULL)
			{
				t=t->link;	
				//printf("while loop of else it's working!!!!'\n");
			}	
			temp->link=t->link;
			t->link=temp;	
			count++;	
			//printf("outside else it's working!!!!!!!!!!!!!!!!'\n");
		}
		printf("omega it's working!!!!!!!!!!!!!!!!'\n");
	}	
}

int main()
{
	int opt,d;
	printf("---->!!!OPTIONS!!!<----\n");
	printf("1.Enter first polynomial\n");
	scanf("%d",&opt);
	
	switch(opt)
	{
		case 1:
			printf("Enter the degree of polynomial\n");
			scanf("%d",&d);
			omega(d);
			showoff();
			break;
	}
}


Что я уже пробовал:

Прежде всего, этот код,который я написал, предназначен для создания связанного списка, поэтому, когда пользователь вводит номер узлов(здесь в программе он обозначается степенью), то программа должна создавать узлы, связанные друг с другом, но вместо этого, когда я запускаю программу, она останавливается после ввода входных данных, она действительно чувствует, что работает, а затем показывает, что она работает.
"Процесс вышел через 4,933 секунды с возвращаемым значением 3221225477
Нажмите любую клавишу, чтобы продолжить ... "

Я попытался отладить программу с моим сумасшедшим стилем написания операторов printf,как вы можете видеть в коде, и обнаружил, что "while loop", который находится внутри "else", не работает, и именно по этой причине программа терпит крах. Кто-нибудь знает, почему??? В коде нет никаких ошибок . Пожалуйста, помогите, это сводит меня с ума, Спасибо!

2 Ответов

Рейтинг:
2

OriginalGriff

Что ж... посмотри на свой код.

printf("else  it's working!!!!!!!!!!!!!!!!'\n");
	while(t->link!=NULL)
	{
		t=t->link;	    (/*<--------------Here's the culprit*/)
			
	}
Но что находится в Т, когда он начинается? Вы не устанавливаете его в какое-либо значение в этом коде ... или даже показать его определение! Поэтому, если вы не установите его на определенное значение в какой - то момент - а я сомневаюсь, что вы это сделаете, потому что он, вероятно, должен быть установлен внутри вашего цикла for, - он может указывать куда угодно.

Используйте отладчик и посмотрите, что именно он содержит.

Кстати: сделайте себе одолжение и сделайте отступы правильно! Это делает его груз легче следовать...


Member 13954179

t-это просто еще один указатель, который я создал для перемещения по связанному списку
структурный узел *t;
Т=начальник;
Я заявил об этом как и выше

OriginalGriff

- Куда же? И когда же? Что было у тебя в голове, когда ты это сделал?

Что показывает отладчик?

Member 13954179

Вы можете видеть через весь код, который я разместил в комментарии, и о голове его значение было нулевым в начале, но после первой итерации цикла for head будет иметь адрес первого узла, а во второй итерации head->Ссылка будет равна второму узлу и так далее.. связанный список должен быть создан, но это не так.

OriginalGriff

- Что показывает отладчик?"
Не "что, по - вашему, показал бы отладчик, если бы вы его использовали?" - "что на самом деле показывает вам отладчик в переменных во время выполнения вашего кода?"

Никогда не думайте, что ваш код верен, или что то, что вы думаете, происходит на самом деле - проверьте это! И идеальным инструментом для проверки этого является отладчик!

Member 13954179

вот и весь код


#включить<stdio.h>
#включить<conio.h>
struct node *head=NULL;
static int count=0;

структурный узел
{
инт коэф;
инт военнопленных;
структурный узел *ссылка;



};
пустая показуха()
{
struct node *трассировка;
след=голова;
printf("\n");
printf("это работает!!!!!!!!!!!!!!!!'1");
а(след!=Нуль)
{
printf ("|||/%x|-->",trace->link);
trace=трассировка->Ссылка;
printf("это работает!!!!!!!!!!!!!!!!'2");
}
printf("это работает!!!!!!!!!!!!!!!!'3");

}
пустота омега(int градус)
{
int i;
структурный узел *temp,*t;
темп=голова;
Т=начальник;

для(i=0;i<=степень;i++)
{
temp=(struct node*)malloc(sizeof(struct node));
//printf("temp it's working!!!!!!!!!!!!!!!!'\Н");
if(count==0)
{

temp->link=head;
голова=темп;
считать++;
//printf("count==0 он работает!!!!!!!!!!!!!!!!'\Н");
}
else if (count==1)
{
темп-&ГТ;ссылка=руководитель->по ссылке;
head->link=temp;
считать++;
//printf("count==1 он работает!!!!!!!!!!!!!!!!'\Н");
}
еще
{
printf("иначе это работает!!!!!!!!!!!!!!!!'\Н");
while(t->link!=NULL)
{
t=t->Ссылка;
//printf("while loop of else it's working!!!!!!!!!!!!!!!!'\Н");
}
temp->link=t->link;
t->link=temp;
считать++;

//printf("снаружи еще работает!!!!!!!!!!!!!!!!'\Н");

}


printf("omega it's working!!!!!!!!!!!!!!!!'\Н");

}



}
тап_п()
{
int opt,d;
printf ("- - - - >!!!Варианты!!!<--- - \n");
printf("1.введите первый многочлен\n");
scanf("%d",&opt);

переключатель(opt)
{
корпус 1:
printf("введите степень многочлена\n");
scanf("%d",&d);
омега(d);
показуха();
перерыв;







}







}

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Рейтинг:
0

Patrice T

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.

#include<stdio.h>
#include<conio.h>
struct node *head=NULL;
static int count=0;

struct node
{
	int coef;
	int pow;
	struct node *link;
};

for(i=0;i<=degree;i++)
{
	temp=(struct node*)malloc(sizeof(struct node));
	//printf("temp  it's working!!!!!!!!!!!!!!!!'\n");
	if(count==0)
	{

		temp->link=head;
		head=temp;
		count++;
		//printf("count==0 it's working!!!!!!!!!!!!!!!!'\n");
	}
	else if (count==1)
	{
		temp->link=head->link;
		head->link=temp;
		count++;
		//printf("count==1 it's working!!!!!!!!!!!!!!!!'\n");
	}
	else
	{
		printf("else  it's working!!!!!!!!!!!!!!!!'\n");
		while(t->link!=NULL)
		{
			t=t->link;	    (/*<--------------Here's the culprit*/)
		}
		temp->link=t->link;
		t->link=temp;
		count++;

		//printf("outside else it's working!!!!!!!!!!!!!!!!'\n");

	}
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

#include<stdio.h>
#include<conio.h>
static int count=0;

struct node
{
	int coef;
	int pow;
	struct node *link;
};
struct node *head=NULL; // Always define a structure before using it !

for(i=0;i<=degree;i++) // what is degree, it comes from nowhere
{

Цитата:
Я попытался отладить программу с помощью своего сумасшедшего стиля написания операторов printf

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


Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Member 13954179

степень-это просто ввод, который будет дан пользователем во время выполнения, и ppolymorphe спасибо за ваш совет, звучит глупо, но я новичок в программировании и не очень разбираюсь в отладке.

Patrice T

- Я не очень разбираюсь в отладке."
дайте ему попробовать

Member 13954179

Поэтому, когда я пытаюсь отладить программу, IDE всегда терпит крах, кстати, это Dev C++

Patrice T

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

Member 13954179

Ну, я не знаю, правильно ли это, и почему-то на этот раз он не разбился.
После отладки он показывает ошибку "программа получила сигнал SIGSEGV,ошибка сегментации"

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Patrice T

ваш код, вероятно, возится с указателями