Member 12834752 Ответов: 1

Почему у меня есть ошибка сегментации в этом программном коде на языке Си?


Я пытаюсь запрограммировать простую задачу слияния с языком Си.
но у меня все еще есть ошибка сегментации, и я застрял в ней. ПОЖАЛУЙСТА, ПОМОГИТЕ...!

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

#include <stdio.h>
#include <stdlib.h>

void merge(int *arr, int start, int mid, int end)
{
	int i, j, k;
	int arrsize=end-start+1;
	int sm_size=mid-start+1;
	int me_size=end-mid+1;
	
	for(i=0; i < arrsize; i++)
        {
            if(j < sm_size && k < me_size)
                if(*(arr+start+j) > *(arr+mid+k))
			{
				*(arr+i) = *(arr+start+j);
				j++;
			}
			
			else
			{
				*(arr+i) = *(arr+mid+k);
				k++;
			}
		}
		
		else if(j

Richard MacCutchan

Ваш код неполон, но если вы посмотрите на то, что у вас есть выше, вы используете переменные i, j и k без их инициализации, так что это никогда не сработает.

Albert Holguin

Вы делаете так много арифметики указателей, что, скорее всего, выходите за рамки. Используйте отладчик или поставьте несколько операторов печати,чтобы выяснить, где вы выходите за пределы.

1 Ответов

Рейтинг:
1

Patrice T

Вам следует подумать об инициализации j и k перед их использованием.
Я боюсь, что вам нужно быстро изучить отладчик, потому что при первом взгляде ваша программа убьет часть значений для сортировки. Если я хорошо помню, слияние не выполняется в одном массиве.

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.

Совет: возьмите лист бумаги и попробуйте сделать это вручную, ваша программа должна использовать ту же процедуру.


Richard MacCutchan

Вы действительно должны перестать публиковать это как решение, это скорее комментарий.

Patrice T

Если вы внимательно прочтете первые 2 предложения, то увидите, что я замечаю 2 проблемы в коде, а затем предлагаю изучить отладчик, который бы их shpw.

Richard MacCutchan

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

Patrice T

Обычно я не публикую это в одиночку, ни в начале, ни в конце, я ставлю что-то непосредственно связанное с вопросом.
Очень жаль, что так много новичков не изучают отладчик как часть своих уроков.