gpt4 book ai didi

c - 正在访问部分初始化的数组 UB?

转载 作者:太空狗 更新时间:2023-10-29 15:28:24 24 4
gpt4 key购买 nike

关于访问未初始化的变量是否会产生未定义的行为(例如在 this SO answer 中)已经进行了多次讨论,我已经查看了这个 online C11 draft standard也涉及不确定的值和未定义的行为。

我在 SO 和标准(也许我忽略了一些东西)中发现,访问未初始化变量时的未定义行为与陷阱表示或具有(隐式)寄存器存储类的可能性有关。

但是如果相应的变量是一个数组(无法获取寄存器存储类),并且数据类型不能有陷阱表示(如根据 6.2.6.1p5 的字符类型)怎么办?

那么访问这样的值还是UB吗?

int main () {
char output[10];
for (int i=0; i<10; i+= 2) { // initializing every 2nd element only
output[i] = '0' + i;
}
char c = output[1]; // accesses something "uninitialized"; But is it UB?
printf("%c\n", c); // prints probably garbage; But what if I don't care?
return 0;
}

最佳答案

这种类型的问题和讨论总是一个挑战,因为它需要解释 C 标准,在许多方面,C 标准并不是为了清楚而写的,而是更多的是两者(或更多)竞争派系将同意包含在其中。经过多次讨论后,很明显,与讨论将其包含在标准中或如何将其包含在标准中以提高可读性的讨论相比,包含什么或不包含的讨论要多得多。

继续评论,我想我们都可以同意,根据评论和答案中引用的次数,C11 Standard (draft n1570) § 6.3.2.1 Lvalues, arrays, and function designators (¶2))适用。

"If the lvalue designates an object of automatic storage duration that could have been declared with the register storage class (never had its address taken), and that object is uninitialized (not declared with an initializer and no assignment to it has been performed prior to use), the behavior is undefined."

(强调我的)

问题变成了,“是一个具有自动存储的数组吗?可以用寄存器存储类声明吗?” p>

乍一看,明显的想法是“一个带有寄存器存储类说明符的数组?那太蠢了,你不能获取地址,你将如何访问这些值?”给定§ 6.2.5 Types (comment 36)) “访问数组成员时,会隐式获取此类对象的地址。”

最初的想法往往是错误的,因为自动存储的数组允许使用寄存器存储类。 § 6.7.1 (6 & comment 121)

下面的代码是完全合法的——虽然可以说没有那么有用。

#include <stdio.h>

int main (void) {

register int a[] = { 1, 2, 3, 4 };
register size_t n = sizeof a / sizeof (int);

printf ("n : %zu\n", n);

return 0;
}

唯一可以应用于用存储类说明寄存器声明的数组的运算符是 sizeof_Alignof。 (参见 § 6.7.1 (comment 121)

鉴于上述情况,并给定数组中任何未初始化的元素“未初始化(未使用初始化器声明并且在使用前未对其进行赋值), 行为未定义。

在您的具体情况下:

    char c = output[1]; // accesses something "uninitialized"; But is it UB?

output[1] 指定一个自动存储持续时间的对象,该对象可以用寄存器存储类声明(从未使用过它的地址),并且该对象未初始化(未用初始化程序声明)并且在使用之前没有对其进行赋值),行为是未定义的。

关于c - 正在访问部分初始化的数组 UB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45806293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com