在C语言编程中,数组元素什么时候存储垃圾值?[duplicate]

eyh26e7m  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(153)

此问题在此处已有答案

initial value of int array in C(共10个答案)
How does an uninitialized array affect the outcome? (no debugging)(5个答案)
17天前关闭。
我写了一段代码来学习数组,我注意到如果数组声明为

a[5];

它将垃圾值存储为它的'元素While

a[5] = {};

正在将0存储为所有元素。
有人能解释一下发生了什么以及这些值是如何存储的吗?
我想知道这是否是静态数据类型,但似乎不是

#include<stdio.h>
   
    void increment();
    
    int main()
    {
        increment();
        increment();
        increment();
    }
    
    void increment()
    {
        int a[5]={};
        static int b[5]={1,2,3,4,5};
        int i;
        for(i=0;i<=4;i++)
        {
            a[i]++;
            b[i]++;
        }
        printf("%d %d\n",a[1],b[1]);
    }
zzwlnbp8

zzwlnbp81#

具有自动存储持续时间的变量(在没有存储类说明符static的块作用域中声明)如果没有显式初始化,则保持未初始化状态。
本声明

int a[5] = {};

在C语言中无效。不能指定空的花括号列表。必须编写例如

int a[5] = { 0 };

int a[5] = { [0] = 0 };

在这种情况下,第一个元素显式初始化为零,所有其他元素隐式初始化为零。
编译器可以有自己的语言扩展,允许使用某些在C标准中无效的构造。
如果数组具有静态存储持续时间(在文件范围中声明或具有存储类说明符static),则如果未显式初始化,则会隐式初始化该数组(对于算术类型,它是以零初始化的)。
具有静态存储持续时间的数组在函数调用之间保留其值。
函数increment

void increment()
{
    int a[5]={ 0 };
    static int b[5]={1,2,3,4,5};
    /...

每次当函数获得控制时,初始化具有自动存储持续时间的数组a
具有静态存储持续时间的数组b在程序启动之前仅初始化一次。

相关问题