【发布时间】:2016-03-04 18:37:58
【问题描述】:
由于不清楚什么是未定义的行为,什么不是 C 语言,我想知道使用 char 访问数组元素是否是未定义的行为。例如:
char c = 'A';
int a[3000];
printf("%i\n", a[c]);
我知道实际上 chars 和 int 是可以互换的,但我仍然不确定。
【问题讨论】:
-
这取决于
'A'的当前编码值是什么。如果它是 ASCII,那么值是65,这是一个有效的索引,所以它是定义良好且行为良好的。 -
我从来没有测试过这个,因为它很糟糕,但如果它是 ASCII 它应该可以工作。
-
a[c] 被转换为 *(&a+c),在你的例子中 c 是 65,所以你会得到第 66 个,a[0] 是数组的第一个成员。但是在您的示例中,数组未初始化,因此您将从堆栈中获得一个随机整数。
-
@nbro 除非类型是
unsigned char或等效类型,否则访问像int a[3000]这样的未初始化数据会引发陷阱表示。每个规格都是 UB。
标签: c undefined-behavior