数组的元素在C编程中什么时候存储垃圾值?[复制]

When do the elements of array store garbage value in C programming? [duplicate]

提问人:Tar 提问时间:11/15/2022 最后编辑:Vlad from MoscowTar 更新时间:11/15/2022 访问量:277

问:

我正在编写代码来学习数组,我注意到如果将数组声明为

a[5];

它将垃圾值存储为其元素 而

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]);
    }
数组 C 初始化存储 持续时间

评论

0赞 Iguananaut 11/15/2022
如果仅声明,则不会初始化其内容。就这样。int a[5]
0赞 Lundin 11/15/2022
好吧, UB,因为它是一个语法错误......int a[5]={};
0赞 Lundin 11/15/2022
还有另一个例子,当蹩脚的默认设置处于活动状态时,gcc 非常不合规......即使使用 -Wall -Wextra,也无法诊断。

答:

1赞 Vlad from Moscow 11/15/2022 #1

具有自动存储持续时间的变量(在没有存储类说明符的块作用域中声明)如果未显式初始化,则它们将保持未初始化状态。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