Почему определение этой переменной размера как const приводит к обнулению памяти? (пример Godbolt включен) - PullRequest
0 голосов
/ 12 февраля 2020

Пример компилятора: https://godbolt.org/z/AEv4Ci

Этот код

int main() {
  const int Size = 16; <-- const
  int arr1[Size];
  int arr2[Size];
  int arr3[Size];
  for (auto I = 0; I < Size; ++I) {
    arr3[I] = arr1[I] + arr2[I];
  }
  return arr3[Size - 1];
}

возвращает 0

, но этот код:

int main() {
  int Size = 16; // <-- not const
  int arr1[Size];
  int arr2[Size];
  int arr3[Size];
  for (auto I = 0; I < Size; ++I) {
    arr3[I] = arr1[I] + arr2[I];
  }
  return arr3[Size - 1];
}

возвращает случайное число

Ответы [ 3 ]

1 голос
/ 12 февраля 2020
int Size = 16; // <-- not const
int arr1[Size];

Эта программа некорректна в C ++, поскольку значения, не зависящие от времени компиляции, не могут использоваться в качестве размера массива.

arr3[I] = arr1[I] + arr2[I];

Значения arr1[I] и arr2[I] являются неопределенными. Поведение чтения неопределенного значения не определено.

Почему ... приводит к ...? ... но этот код ... возвращает случайное число

Потому что в обоих случаях поведение программы не определено.

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

2-й код

int Size = 16; // <-- not const
int arr1[Size];

содержит ошибку в VS C ++ (некоторые компиляторы допускают это).

В коде arr1 arr2 не инициализируются, arr1 [I], arr2 [I], arr3 [I] имеют неопределенные значения, присваивание «arr3 [I] = arr1 [I] + arr2 [I];» имеет неопределенное поведение.

Неопределенное поведение проявляется в получении произвольных значений, хранящихся в настоящее время в arr1 [I], arr2 [I], и сохранении результата «+» в arr3 [I]. Конкретные значения в arr1 [I], arr2 [I] могут меняться между прогонами или во время одного прогона.

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

В обоих случаях вы, по сути, читаете унифицированные данные, поэтому программа возвращает значения мусора. Это просто случайность, что он возвращает 0. Попробуйте, например, с Size = 14 или другим числом, он также вернет некоторые случайные значения в случае const.

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