Почему эта структура сортировки приводит к сбою моей программы?

#c #sorting #struct

#c #сортировка #структура

Вопрос:

 void sortAlphabetically(int listLength, contactInfo* arrayOfStructs)
{
    contactType temp;

    for (int i = 0; i < listLength; i  )
    {
        if (strcmp(arrayOfStructs[i].contactName, arrayOfStructs[i 1].contactName) > 0)
        {
                     temp = arrayOfStructs[i];    //swapping entire struct
                     arrayOfStructs[i] = arrayOfStructs[i 1];
                     arrayOfStructs[i 1] = temp;
        }
    }
}
  

Комментарии:

1. С какой именно ошибкой происходит сбой вашей программы?

2. Вопрос получше: почему вы делаете это вместо использования std::sort ?

3. @maxpm program.exe перестал работать

Ответ №1:

Следующее выражение недопустимо, когда i == (listLength-1) (предполагая, что listLength это количество элементов в arrayOfStructs ):

 arrayOfStructs[i 1]
  

Ответ №2:

Вы должны выполнить итерацию только до listLength - 1 или проверить, что вы не дошли до последнего элемента, прежде чем ссылаться arrayOfStructs[i 1] .

Ответ №3:

Похоже, что вы индексируете вне границы массива:

arrayOfStructs[i 1]

Я предполагаю, что listLength это длина списка, означающая, что это на единицу больше, чем последний элемент списка. Ваше условие for i < listLength удерживает i в пределах границ, но не i 1.

Это может привести, а может и нет, к сбою.

Ответ №4:

Я полагаю, это из-за следующих строк:

 arrayOfStructs[i] = arrayOfStructs[i 1];
arrayOfStructs[i 1] = temp;
  

Более конкретно, i 1 часть. Если ваш for цикл выполняется от нуля до listLength - 1 , на последней итерации вы попытаетесь получить доступ к одному элементу за пределами фактического диапазона.

Вы можете использовать i < listLength - 1 для устранения проблемы или просто использовать if инструкцию внутри цикла. Изменение условия, вероятно, является лучшей практикой.