gpt4 book ai didi

C 指向负长度数组的指针奇怪的行为 Apple LLVM 编译器

转载 作者:行者123 更新时间:2023-11-30 20:41:09 30 4
gpt4 key购买 nike

我知道负长度数组具有未定义的行为,但由于 E1[E2] 的标准与 (*((E1)+(E2))) 相同,我希望有些东西可以工作。

因此,在本例中,我所做的是创建一个在 -32 方向上跨越的数组,因此我期望获得的可访问索引为 -31 到 0。

我使用 0 到 255 的 8 位无符号字符和 -128 到 +127 的有符号字符,但 32 位整数和 64 位整数也会发生这种情况。

我使用 C99 声明可变长度数组的能力来构造负跨度数组,特别是我正在按照 GNU99 C 标准进行编译。

我将这些值分配给索引并打印出来,一切似乎都工作正常。

当我创建一个指向数组索引 [-31] 处的值的指针,然后循环遍历该值(0 到 31)并打印这些值时,情况会变得很奇怪。

const signed char length = 32;
const signed char negativeLength = -length;

signed char array[negativeLength];
for ( signed char ii = 0; ii > negativeLength; ii-- ) {
array[ii] = ii;
printf( "array %d\n", array[ii] ); /* Prints out expected values */
}

printf( "==========\n" );

signed char * const pointer = &array[negativeLength + 1];
for ( unsigned char ii = 0; ii < length; ii++ ) {
printf( "pointer %d\n", pointer[ii] ); /* Begins printing expected values then goes funky */
}

我每次都会得到不同的结果,但是对于 32 来说,前 3 个值通常一开始没问题,然后就变得很奇怪,开始打印 -93 到 +47,然后在索引指针 [8]、数组 [- 23]一切又恢复正常了。

我在 iPad 2 上运行此程序。

这里到底发生了什么?当 iPad 检测到负跨越数组长度时,它是否会干扰指针或数组?

最佳答案

我有时主张在 C 标准未定义行为的情况下理解某些 C 实现中观察到的行为,因为它可以阐明某些实现如何工作或计算机如何工作。但在这种情况下:不要这样做。

要访问具有任意整数索引(从 X(包含)到 Y(不包含))的数组,请执行以下操作:

ElementType ArrayMemory[Y-X], *Array = ArrayMemory - X;

如果 X <= 0 <= Y 且 X < Y,则其行为由 C 标准定义。

关于C 指向负长度数组的指针奇怪的行为 Apple LLVM 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17021660/

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