Почему я получаю чрезвычайно большие числа при добавлении элементов массива в c ?

#c #arrays #add

#c #массивы #Добавить

Вопрос:

Я пытался добавить первые 4 числа моего массива. Когда я тестирую это, я всегда получаю число «4201077», даже если первые цифры 4 — это 1, 2, 3 и 4. Когда я пытаюсь начать с разных чисел, я получаю немного другой вариант, такой как «4201092». Что я делаю не так? код:

 int main(){
   int a [10];
   int count;


   for (int i = 0; i < 10; i   )
       cin >> a[i];

   int i = 0;
      while ( i < 4){
       count  = a[i];
       i  ;
      }

   cout << count;
    
}
  

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

1. Если вы компилируете с включенными предупреждениями, компилятор, скорее всего, сообщит вам о подобных проблемах. Например, g -Wall или clang -Wall .

2. Ваш компилятор должен был предупредить вас

3. Вот один из способов, которым вы могли бы избежать инициализации count: #include <numeric> ... int count; ... count = std::accumulate(a, a 4, 0);

Ответ №1:

Вы никогда не инициализируете count для хранения какого-либо значения. Строка count = a[i]; считывается из count , чтобы добавить a[i] к этому значению. В C чтение из неинициализированной переменной в большинстве случаев является неопределенным поведением, включая этот. Следовательно, ваша программа может делать вообще что угодно, включая (но не ограничиваясь этим) печать неправильного результата, сбой или вообще ничего не делать.

 // You have:
int count;

// Replace with:
int count = 0;
  

Всегда включайте все предупреждения компилятора и исправляйте любые, которые появляются. Каждый широко используемый компилятор помечает строку count = a[i]; предупреждением о чтении из неинициализированной переменной. Например, gcc говорит следующее:

 main.cpp: In function 'int main()':
main.cpp:14:14: warning: 'count' is used uninitialized in this function [-Wuninitialized]
   14 |        count  = a[i];
      |        ~~~~~~^~~~~~~
  

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

1. «Поскольку количество подписано, чтение его значения является технически неопределенным поведением». Я почти уверен, что ошибка произошла бы, даже если бы она была без знака?

2. @Borgleader уже исправлено. Для этого словоблудия была причина, но это неважно.

3. » чтение из неинициализированной переменной в большинстве случаев является неопределенным поведением » — У вас есть пример, где это не так?

4. @Kevin Например, если тип имеет беззнаковый узкий символьный тип. В этом случае значение просто не указано, но нет UB.

5. @Kevin Это прямо в правиле, которое гласит, что это UB в первую очередь. Правило продолжает что-то вроде «не определено, за исключением …», а затем перечисляет случаи, когда это не UB.

Ответ №2:

Чтение неинициализированных переменных — это UB :https://en.cppreference.com/w/cpp/language/ub — что вы делаете с count = a[i]; , когда вы никогда не инициализировали count .