用C编程我的arduino微控制器板,我注意到一种奇怪的行为。
由于程序中存在逻辑错误,控制器访问了整数数组的-1
元素。
int array[5];
array[4] = 27;
// array[-1] gives 27 now.
使用-1
作为元素选择器来获取数组的最后一个元素是否正确?
答案 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.很烦人,不是吗。