Почему я получаю ошибку сегментации? - PullRequest
0 голосов
/ 17 февраля 2020

Для моего класса мы используем два компилятора, xcode и codeboard, где codeboard является более строгим из двух и имеет список предустановленных утверждений для тестирования вашего кода. В моем коде для функции a у меня есть вложенные циклы, где я хочу, чтобы я всегда был на шаг впереди k. Он отлично работает в xcode, но дает мне ошибку сегментации на кодовой доске.

for (int k = 0; k <= n-2; k++) {
    for (int i = k+1; i <= n-1; i++) {
        if (array[k] == array[i])

Что странно, если я использую k ++ или ++ k вместо k + 1, это не приведет к ошибке сегментации , но мой код не пройдет все утверждения. Я думал, что они должны были быть одним и тем же?

Что еще более странно, если я использую k + 1 в функции b, это не приведет к ошибке в кодовой доске.

for (int k = 0; k <= n-1; k++) {
    for (int i = k+1; i <= n-1; i++) {
        if (array[k] > array[i])

По сути, что здесь происходит?

Редактировать: Итак, я получаю от всех то, что когда я использую i = k + 1 во внутренней l oop , это увеличивает значение k во внешнем l oop. Мол, если k = 1, i = 2, то когда он возвращается к внешнему l oop, k = 3. Если это так, то как бы я смог опередить k?

Редактировать: Пожалуйста, игнорируйте k ++ и k + 1 часть моего вопроса, это не было моей главной проблемой, просто побочная вещь, которая немного смутил меня, но я чувствую разницу сейчас. Я бы удалил эту часть из своего поста, но я уверен, что это запрещено. Мой главный вопрос - как сохранить значение i на 1 больше, чем значение k?

В следующем коде цель состоит в том, чтобы, если любое из значений массива было одинаковым, в какой-то момент оно должно иметь значение true. Что касается воспроизводимых результатов:

string a[3] = {"aaa", "bbbb", "cccc"};
int n = 3;
for (int k = 0; k <= n-2; k++) {
    int b = 0;
    for (int i = k+1; i <= n-1; i++) {
        if (a[k] == a[i])
            b++;
    }
    if (b != 0) {
        cout << "true" << endl;
        break;
    }
    else
        cout << "false" << endl;
}

Ответы [ 3 ]

3 голосов
/ 17 февраля 2020

Нет, они не одинаковы:

k + 1
Возвращает значение k плюс один, но не меняет само значение k.

++k
Добавляет 1 к k и возвращает новое значение (предварительное увеличение).

k++
Также добавляет 1 к k, но возвращает предыдущее значение k (постинкремент).

0 голосов
/ 17 февраля 2020

k ++ и k + 1 не одинаковы.

Если вы используете k ++ вместо k + 1 внутри l oop в коде, который вы показали, вы фактически выполняете два приращения для переменной k, что обычно не то, что вы хотите в управляющей переменной al oop.

  • K + 1 не меняет значение k.
  • k ++ увеличивает k после использования его значение.
  • ++ k увеличивает значение k перед использованием его значения.

Таким образом, в основном происходит то, что каждый раз, когда вы запускаете внутреннюю l oop, k увеличивается. Но в последнем раунде внешнего l oop, когда k равно n-1, вы выполняете другое приращение, которое устанавливает k в n, и это, безусловно, не то, что вы хотели.

0 голосов
/ 17 февраля 2020

k++ и ++k оба увеличивают k на единицу, изменяя значение k.

k+1 нет.

Ваша ошибка сегментации происходит из-за тот факт, что вы увеличиваете k каждый раз, когда оценивается ваш начальный for-l oop, но также каждый раз, когда инициализируется ваша секунда для l oop. Это означает, что вы читаете дальше вашего массива в конце вашего l oop.

...