Элементы массива (после использования составного оператора присваивания) выдают значение мусора, почему?
#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)
за исключением того, что lvalueE1
оценивается только один раз, и в отношении вызова функции с неопределенной последовательностью операция составного присваивания является единственной оценкой. ЕслиE1
имеет атомарный тип, составное присваиваниеread-modify-write
работа сmemory_order_seq_cst
семантика порядка памяти.
Итак, используя +=
на неинициализированном значении _ вы пытаетесь прочитать (или использовать) переменную с неопределенным значением, которое вызывает UB.
Если вы хотите, вы можете инициализировать весь массив, используя синтаксис, такой как
int total[3] = {0};
который инициализирует все элементы массива в 0, что вы и ожидали.
Это сказало, void main(void)
не соответствует подписи для main()
в размещенной среде, согласно спецификации, она должна быть int main(void)
, по крайней мере.