Member 13954179 Ответов: 2

Есть ошибка сегментации из кода, как от нее избавиться?


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

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

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
static int count=0;
struct node
{
	int coef;
	int pow;
	struct node *link;
};

struct node *head=NULL;

void showoff()
{
	struct node *t1;
	t1=head;
	while(t1!=NULL)
	{
		printf("|%d|%d|%x|--",t1->coef,t1->pow,t1->link);
		t1=t1->link;
	}
}

int main()
{
	int n,i=0;
	struct node *temp,*t;
	t=head;
	printf("Number of nodes\n");
	scanf("%d",&n);
	
	while(i<n)
	{
		temp=(struct node*)malloc(sizeof(struct node));
		temp->coef=NULL;
		temp->pow=NULL;
		
		if(count==0)
		{
			temp->link=head;
			head=temp;
		}
		if(count==1)
		{
			temp->link=head->link;
			head->link=temp;
		}
		if(count>1)
		{
			while(t->link!=NULL)    /*Responsible for error. Can you explain why*/
			{
				t=t->link;
			}
			temp->link=t->link;
			t->link=temp;
		}
		count++;
		i++;
	}
	showoff();
}

2 Ответов

Рейтинг:
1

raddevus

Попробуйте разбить следующую строку на две строки:

struct node *temp,*t;


Сделай это:
struct node *temp;
struct node *t;


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


Рейтинг:
0

Rick York

Во-первых, вы должны использовать отладчик, чтобы исправить это. Он быстро покажет вам, в чем именно заключается проблема. Если у вас его нет с вашим компилятором, то получите тот, который есть. Visual Studio 2017 community edition доступна бесплатно, т. е. бесплатно.

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

Попробуйте настроить свой цикл так, чтобы вы отображали вещи в каждой итерации :

// ...
	for( i = 0; i < n; ++i )    // I prefer a for loop for this
	{
		// ... logic goes here

		printf( "i is %d, count is %d\n", i, count );
		showoff();
		count++;
	}


Member 13954179

Да, я использовал отладчик, и он показывает, что есть какая-то проблема с"while(t - >link!=NULL)".
Сообщение об ошибке "программа получила сигнал SIGSEGV,ошибка сегментации"

Member 13954179

Итак, я понял, что проблема заключается в указателе t, но теперь что? Я буквально не знаю, что это такое. Я имею в виду логически программа права

Rick York

В этот момент Вы должны пройти через программу и наблюдать за всем, что она делает, чтобы вы могли видеть, где она становится недействительной. Если это происходит в течение некоторого времени, то вы можете добавить операторы trace или printf для отображения важной информации. Это одна из самых трудных вещей, чтобы узнать о программировании, и это отладка того, что вы написали. В конце концов вы научитесь методам, которые помогут вам писать код, который легче отлаживать.

Rick York

У вас есть функция показухи. Я бы переместил его так, чтобы он отображал вещи после каждой итерации, чтобы вы могли убедиться, что вы правы с каждым из них. Также покажите счетчик, пока вы на нем находитесь. Эти вещи хорошо помогают вам лучше видеть, что происходит, и это ключ к отладке : смотрите, что происходит со всеми вашими данными. Я скорректирую свое первое решение, чтобы вы могли лучше понять, что я имею в виду.

Member 13954179

Спасибо наконец то я его получил

Rick York

Что вы сделали, чтобы исправить это?

Member 13954179

Когда приходит условие, что count > 1, t остается нулевым. Поскольку я установил t = head в начале основной функции, в for loop head изменяется, но t не обновляется и все еще содержит нулевое значение, поэтому я установил t = head в области видимости для if (count>1). И проблема решена. Спасибо всем