为什么以下代码打印垃圾值?

问题描述 投票:0回答:2

我不明白为什么下面的代码打印垃圾值

#include <stdio.h> 

void main(){
 int arr[5],i=0;
 while(i<5)
    arr[i]=++i;
for(i=0;i<5;i++)
    printf("%d",arr[i]);
 }
c arrays loops while-loop garbage
2个回答
2
投票

声明

arr[i]=++i;

实际上等效于

i = i + 1;
arr[i] = i;

这意味着您将不会初始化数组中的第一个元素(在索引0处)。更糟糕的是,您也将在索引5处进行写,这是out of bounds,并且会导致undefined behavior

未初始化的局部变量将具有一个indeterminate值,该值可能被视为随机或垃圾。

我建议您也有一个for循环,就像用于打印初始化值的循环一样:

for (i = 0; i < 5; ++i)
    arr[i] = i + 1;

0
投票

表达式arr[i] = ++i未定义,因为您正在同时读写i

=不是序列点,因此不能假设在获取i的索引之前先增加了arr

即使 i在获取arr的索引之前已被增加(因为在某些语言中,例如C ++ 17,这是必需的,所以由于输出不正确,程序行为仍将是不确定的边界数组访问)。

© www.soinside.com 2019 - 2024. All rights reserved.