数组[-1]是否给出了数组中的最后一个元素?

时间:2012-03-25 16:13:09

标签: c arrays

用C编程我的arduino微控制器板,我注意到一种奇怪的行为。

由于程序中存在逻辑错误,控制器访问了整数数组的-1元素。

 int array[5];

 array[4] = 27;
 // array[-1] gives 27 now.

使用-1作为元素选择器来获取数组的最后一个元素是否正确?

6 个答案:

答案 0 :(得分:14)

不,访问索引范围之外的元素是未定义的行为。在您的情况下,数组开头之前的地址处的元素设置为27。

由于访问C中的数组元素只不过是做“直接”指针算法,因此不允许传递负数索引。您可以构建一个合法的用例,其中索引为负数和正数:

int raw[21], *data = &raw[10];
for (int i = -10 ; i <= 10 ; i++) {
    data[i] = i;
}

答案 1 :(得分:6)

没有; array[-1]将无法访问最后一个元素。阵列之前的内存位置更有可能存储在27中。试试这个:

array[4] = 27;
array[-1] = 0;

然后测试是否array[-1] == array[4]。它们不相等(假设您的程序在分配给array[-1]时不会崩溃)。

答案 2 :(得分:2)

访问索引越界的数组并不总是会导致程序崩溃。如果由-1访问的内存在程序控制之下,则将弹出未定义的值(由程序创建的其他一些数据存储)。在你的情况下,这只是巧合。

答案 3 :(得分:1)

不,根据标准,这是不正确的。访问数组外部的元素会调用Undefined Behavior。

您的实施可能(我怀疑它!)提供该功能;但你真的应该依赖它。

答案 4 :(得分:-1)

尝试并理解下面的示例代码,您将得到答案。

#include<stdio.h>

int main()
{
int raw[4], *data = &raw[2];

raw[0]=0;
raw[1]=1; // -1 index for data
raw[2]=2;
raw[3]=3;

for (int i = 0 ; i < 2 ; i++) {
    printf("\nvalue =%d i=%d\n",data[i],i);
}
printf("\nIndex,[-1]=%d\n", data[-1]);
return 0;

}

`

答案 5 :(得分:-4)

如果你指的是C(你是),那么没有。如果您尝试访问具有负索引的数组,则会出现超出范围的异常。但是,Lua将这一功能作为一项功能实现。如果访问索引为-1的Lua数组,它将读取数组的最后一个元素。索引为-2将读取倒数第二个元素,依此类推。

旁注:你可以通过写这个来惹恼你的同事

foo = {1,2,3,4,5,6,7,8,9,0}
print(foo.length() * -1])

这打印1.很烦人,不是吗。