Отличается ли сложение указателя с переменной int от сложения с литералом int? - PullRequest
0 голосов
/ 28 марта 2020

Рассмотрим этот фрагмент кода, пытаясь проверить, равны ли два массива:

int arr1[5] = {1,2,3,4,5};
int arr2[5] = {1,2,3,4,5};

int *p1 = arr1;
int *p2 = arr2;

if (end(arr1) - p1 == end(arr2) - p2) // Check if sizes are equal
{
    for (size_t i = 0;
         p1 != end(arr1);
         ++i){
             if (*(p1 + i) != *(p2 + i)){ // Check if each ith element is equal
                 cout << "Arrays not equal!" << endl;
                 return 0;
             }
         }
    cout << "Arrays equal!" << endl;
    return 0;
}
else // Not equal if sizes don't match
{
    cout << "Arrays not equal!" << endl;
    return 0;
}

Когда я запускаю этот код, я получаю "Arrays not equal!". Итак, я искал условие if, когда заметил, что *(p1 + i) для первого i, то есть i = 0, похоже, дает значение 32766, тогда как если я пишу *(p1 + 0), Я получаю первый элемент arr1, как и ожидалось. Почему это происходит?

1 Ответ

2 голосов
/ 28 марта 2020

Ваше условие l oop неверно, p1 никогда не равно end(arr1), поэтому i выходит далеко за границы массива.

int arr1[5] = {1, 2, 3, 4, 5};
int arr2[5] = {1, 2, 3, 4, 5};

int *p1 = arr1;
int *p2 = arr2;

if (std::end(arr1) - p1 == std::end(arr2) - p2) // Check if sizes are equal
{
    for (size_t i = 0;
         (p1 + i) != std::end(arr1); // (p1 + i) instead of p1 here
         ++i) {
        if (*(p1 + i) != *(p2 + i)) { // Check if each ith element is equal
            std::cout << "Arrays not equal!" << std::endl;
            return 0;
        }
    }
    std::cout << "Arrays equal!" << std::endl;
    return 0;
} else // Not equal if sizes don't match
{
    std::cout << "Arrays not equal!" << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...