【问题标题】:What happens in C when you reference an undefined element of an array? [duplicate]当您引用数组的未定义元素时,在 C 中会发生什么? [复制]
【发布时间】:2015-12-18 18:05:12
【问题描述】:

如果我在没有初始化所有值的情况下定义一个数组,如下所示:

int x[10] = {1, 3, 5, 2, 9, 8, 4, 7, 6};

例如,如果我引用x[9],会发生什么?它获取什么价值?是0 是因为我没有定义那个值吗?

【问题讨论】:

  • 标题答案:当代码引用数组的 undefined 元素时,它是未定义的行为。正文回答:OTOH,OP 示例是对 defined 数组元素的引用,x[9] 为 0。

标签: c arrays variables memory


【解决方案1】:

例如,如果我引用 x[9],会发生什么?

它将为零(如您所见)。当你初始化一个数组的一个或多个元素时,数组的其余元素被隐式初始化为零。

这不是因为您没有“定义”任何值,而是因为 C 标准要求的行为。

C11 草案,第 6.7.9 节,初始化

如果大括号括起来的列表中的初始值设定项比那里少 是聚合的元素或成员,或 用于初始化已知大小的数组的字符串文字 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间。

这意味着 x[9] 将初始化为 0,因为您已明确初始化索引范围 0-8。

同样,如果您有:

int i;
int j;

int *ptrs[10] = {&i, &j}; // an array of 10 pointers

其余的指针,索引范围从 2-9 将被隐式初始化为空指针。

【讨论】:

    【解决方案2】:

    Initializer list 将按照索引的递增顺序初始化数组元素。如果初始化列表的大小小于数组的大小,则其余元素使用0进行初始化,

    【讨论】:

    • 在java中,会抛出arrayindexoutofbounds异常!!...c中有没有类似的异常??
    • C 中没有异常。异常是高级语言的构造。 (java、C++ 等)
    • @IIIIIIIIIIIIIIIIIIIIIIII 指出 C 中没有与 Java 不同的异常处理程序。
    • @MathewsMathai 不,它不会 - 数组有 10 个成员的空间,所以访问 [9] 不会抛出异常 - 你可能(我还没有检查过)得到一个编译时间初始化器中的元素数量与数组大小不匹配的错误。
    • 要清楚,在一般情况下,元素在内存中是零(所以每个字节都是零)。
    猜你喜欢
    • 2015-09-21
    • 2010-10-28
    • 2019-03-31
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2016-01-17
    • 2011-03-06
    相关资源
    最近更新 更多