数组下标可以用负数吗?为何老是输出0

昵称是可以中文吗 2010-09-07 12:31:31
#include "stdio.h"
void main(){
int b[400],i=0;
printf("%3d\n",b[i-1]);
printf("%3d\n",b[i]);
printf("%3d\n",b[i+1]);
printf("%3d",b[i+2]);
}
请问为何第一个老是输出0,是不是B【-1】就是输出0?好像没数组b[400]输出的就是地址码
...全文
1443 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
湛卢VV 2012-04-10
  • 打赏
  • 举报
回复
如果下标用了负数 那么大小会折半
yekeyishuo 2010-09-27
  • 打赏
  • 举报
回复
越界出错
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 zyj_604 的回复:]
引用 4 楼 scauscnu 的回复:
引用 2 楼 pengzhixi 的回复:
输出什么值一般是随机的。当然也可能输出其他变量的值

第一个每次都输出0


把i值改一下,输出的应该是i的值
i先入栈,然后数组入栈
[/Quote]
试过了,谢谢
qweworld 2010-09-11
  • 打赏
  • 举报
回复
边界越界,会出错
myerel 2010-09-11
  • 打赏
  • 举报
回复
给你这个例子并不是让你去这样用,实际上数组越界和数值不赋初始值都是安全编程应该避免的。
myerel 2010-09-11
  • 打赏
  • 举报
回复
数组下标为负可以操作,但是会越界造成错误。
你测试的结果输出混乱是由于你没有初始化b[400]数组。它里面的值当然是不确定的。
代码测试如下:
#include <stdio.h>

void main()
{
int b[400],i=0;
for(i=0;i<400;i++)
{
b[i] = i;
}
printf("%d \n",b[-1]); //随机值
printf("%d \n",b[-0]); //0
printf("%d \n",b[1]); //1
printf("%d \n",b[2]); //2
b[-1] = -1;
printf("%d \n",b[-1]); //-1
system("pause");
}



Shrek_MyCpp 2010-09-10
  • 打赏
  • 举报
回复
每次并不代表所有。
输出0只是一个巧合而已。
queatin_man 2010-09-10
  • 打赏
  • 举报
回复
没这么用过
love_yiyi 2010-09-10
  • 打赏
  • 举报
回复
估计要越界
qrp_pig 2010-09-10
  • 打赏
  • 举报
回复
应该b[400]先入栈,k后入栈,所以b[-1]取的是k的数据
qrp_pig 2010-09-10
  • 打赏
  • 举报
回复
void main(){
int b[400] ;
int k = -1 ;
int i=0;

printf("%3d\n",b[i-1]);
printf("%3d\n",b[i]);
printf("%3d\n",b[i+1]);
printf("%3d",b[i+2]);
}

输出的就是-1,哈哈
乐CC 2010-09-10
  • 打赏
  • 举报
回复
支持zyj_604的说法,i先入栈,取值的时候是按压入数组首地址加偏移取的,刚好取到i
乐CC 2010-09-10
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>

#include "stdio.h"
void main(){
int b[400],i=2;
printf("%3d\n",b[i-3]);
printf("%3d\n",b[i]);
printf("%3d\n",b[i+1]);
printf("%3d",b[i+2]);
}

改了下,确实这个越界是踩到i的空间了,输出i的值2
T0Ols 2010-09-10
  • 打赏
  • 举报
回复
这个我真不知道
wangguilin 2010-09-10
  • 打赏
  • 举报
回复
很危险的操作
luzhiwei512 2010-09-07
  • 打赏
  • 举报
回复
0040133B dec eax
0040133C mov eax,DWORD PTR [esp+eax*4+0x1c]
估计你的地址空间刚好一直没被赋值一直为0
yashuwa0622 2010-09-07
  • 打赏
  • 举报
回复
不推荐使用,会引发问题,你可以把负数索引当做错误
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]
输出什么值一般是随机的。当然也可能输出其他变量的值
[/Quote]
第一个每次都输出0
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
当然支持-1,-1下标就是b所在内存前面一个内存的值,看看下面代码的输出


C/C++ code

#include "stdio.h"
#include <stdio.h>
int main(){
int a = 1;
int b[400],i=0;
int b =2;
printf("%3d\n",b[i-1]);
printf("%3d\n",b[i])……
[/Quote]
好像不是所有的数组如b[-1]输出的值都为0
pengzhixi 2010-09-07
  • 打赏
  • 举报
回复
输出什么值一般是随机的。当然也可能输出其他变量的值
加载更多回复(23)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧