Элементы массива (после использования составного оператора присваивания) выдают значение мусора, почему?

#include<stdio.h>
void main(void)
{
    int a[5]={90,78,77,98,98}, b[5]={80,45,67,88,57}, c[5]={88,99,65,55,74},total[3],i,j;
    for(j=0;j<=4;j++)
        {
            total[0]+=a[j];
            total[1]+=b[j];
            total[2]+=c[j];
        }

    for(i=1;i<=3;i++)
    {
    printf("%d행의 가로 합 : %d\n",i,total[i-1]);
    }
}

total[0] а также total[1] правильное значение, но total[2] неправильное значение Я не могу найти свою ошибку. Вы можете это объяснить?

1 ответ

Решение

Первая проблема здесь в коде

        total[0]+=a[j];
        total[1]+=b[j];
        total[2]+=c[j];

где вы используете total[n]не инициализировано. Они содержат неопределенные значения, и их использование вызывает неопределенное поведение.

Разрабатывать, total Будучи неинициализированной автоматической локальной переменной, начальные значения элементов массива являются неопределенными. Используя += оператор этих элементов, вы пытаетесь прочитать (использовать) значения, которые являются неопределенными, поэтому он вызывает UB в вашем случае.

Связанные цитаты из C11Глава §6.5.16.2, Составное назначение,

Составное назначение формы E1 op= E2 эквивалентно простому выражению присваивания E1 = E1 op (E2)за исключением того, что lvalue E1 оценивается только один раз, и в отношении вызова функции с неопределенной последовательностью операция составного присваивания является единственной оценкой. Если E1 имеет атомарный тип, составное присваивание read-modify-write работа с memory_order_seq_cst семантика порядка памяти.

Итак, используя += на неинициализированном значении _ вы пытаетесь прочитать (или использовать) переменную с неопределенным значением, которое вызывает UB.

Если вы хотите, вы можете инициализировать весь массив, используя синтаксис, такой как

  int total[3] = {0};

который инициализирует все элементы массива в 0, что вы и ожидали.

Это сказало, void main(void) не соответствует подписи для main() в размещенной среде, согласно спецификации, она должна быть int main(void), по крайней мере.

Другие вопросы по тегам