Локальная переменная изменяется без манипуляций - PullRequest
0 голосов
/ 06 марта 2019

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

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

int main()
{
    int amount;
    int numbersarray[] = {};
    std::cout << "How many numbers do you want to sort? " << std::endl;
    std::cin >> amount; 
    for(int i = 0; i <= amount; i++){
        std::cout << "Enter number to be sorted: " << std::endl;
        std::cin >> numbersarray[i]; 
    }
    std::cout <<"Amount to be sorted: " << amount << std::endl;

    for(int i = 0; i <= amount; i++){
        std::cout << numbersarray[i] << std::endl;
    }
}

То, что я ожидаю, произойдет, когда я введу сумму как 5, я смогу ввести 5 элементов в массив, но вместо этого напечатанное количество равно 2, а максимальное количество элементов, которое я могу поместить в массив, равно 3.

Ниже приведен результат выполнения.

How many numbers do you want to sort? 
5
Enter number to be sorted: 
5
Enter number to be sorted: 
2
Enter number to be sorted: 
5
Amount to be sorted: 2
5
2
5

Я пытался возиться с оператором for, но я не думаю, что я делаю это правильно, поскольку это не устранило проблему. Манипулирование оператором for, которое я делаю, меняет условие (т.е. ! =, <, <=) </p>

Ответы [ 2 ]

5 голосов
/ 06 марта 2019

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

Существует много проблем.Во-первых, ваша программа недействительна в соответствии со стандартом:

int numbersarray[] = {};

Это недопустимо.Размер массива:

constexpr int max_amount = 32;
int numbersarray[max_amount] = {};

Если вам нужно, чтобы он был динамическим, используйте vector:

std::vector<int> numbersarray;
numbersarray.resize(amount);

Во-вторых, у вас есть другой источник неопределенного поведения:

//     Iterates too much, numbersarray[amount] is past the end
//             ~~~v~~~~~~~
for(int i = 0; i <= amount; i++){
    std::cout << "Enter number to be sorted: " << std::endl;
    std::cin >> numbersarray[i]; 
}

Это должно быть:

for(int i = 0; i < amount; i++){
    std::cout << "Enter number to be sorted: " << std::endl;
    std::cin >> numbersarray[i]; 
}

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

1 голос
/ 06 марта 2019

numbersarray - это массив в стиле C с нулевым размером, который динамически не регулирует свой размер (большинство компиляторов может даже не скомпилировать int numbersarray[] = {};, поскольку пустой массив не разрешен для массива с неопределенным размером).

Запись или чтение его элементов вызывает неопределенное поведение (это может быть нарушение доступа, изменение несвязанных переменных и многое другое).Это причина, по которой вы можете увидеть изменение значений локальных переменных.Кто-то еще, использующий тот же код, может получить совершенно другое поведение, поскольку он не определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...