为什么出现数组下标越界的情况?

zaixiankaifa 2013-09-07 08:40:56
#include <stdio.h>

int main()
{
char *str="apple ipod";
int i;
for(i=0;*str!='\0';i++)
{
printf("str[%d]=%c\n",i,str[i]);
}

return 0;
}


问题:
编译没有问题,但是运行的时候出现数组下标越界的情况,请问为什么? 在循环里面不是已经设置了 " *str!='\0' " ? 为什么还出现这样的下标越界情况? 如果将 *str改成str[i]则不会。
...全文
626 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
kasim0070 2013-09-16
  • 打赏
  • 举报
回复
str一直保持都是指向开头(你又没修改str),for判断语句一直成立,当然越界了(新手作答)
云斜月 2013-09-16
  • 打赏
  • 举报
回复
引用 3 楼 zaixiankaifa 的回复:
[quote=引用 1 楼 u010222864 的回复:] 你这个是有问题的,*str始终指向的是首地址,不会出现*str等于'\0'的情况,所以i++会出现越界的情况
不对呀,str[i]已经不断向后循环遍历了,那么*str就不是一直指向首地址啦[/quote] *str一直都是指向首地址,你没有改变他,str[i]和*str不一样的,,
苏存章 2013-09-16
  • 打赏
  • 举报
回复
尼玛,我第一眼看错了 。再仔细一看,搂主初学者吧,赶紧回去学好基础再来
lm_whales 2013-09-15
  • 打赏
  • 举报
回复
指针和数组,获取元素的值都有 指针和数组,两种用法,二者不要混用,单独使用一种即可 楼主,把指针用法,和数组用法混用, 这种不一致的后果就是 *str!='\0'这个条件表达式,没有随着循环变化 结果就是,条件永远成立,变成死循环了; 如果都是指针用法,循环递增表达式自然就是 str++,++str 这种; 这样循环,可以结束. 如果都用数组用法,条件表达式 就会改成 str[i]!='\0';这样循环,也可以结束. 但是这样两种用法,混合使用,就把自己搞晕了,于是循环递增表达,和条件表达式就没有配合好. 循环就不能结束了
赵4老师 2013-09-12
  • 打赏
  • 举报
回复
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
softlove11 2013-09-11
  • 打赏
  • 举报
回复
*str++就好了
Adol1111 2013-09-11
  • 打赏
  • 举报
回复
就地址来说,str[i]等价于*(str+i),*str等价于*(str+0),也就是str[0]。所以i才是下标,下标虽然长了,但str指向依然没变。如果要改变str的指向,应该用++、--操作符。但最好另取一个指针,不然之前的地址会被丢弃。比如,可以这样:
const char *s;
for(s=str;*s!=0;s++)
    printf("str[%d]=%c\n",i,*s);
Kaile 2013-09-11
  • 打赏
  • 举报
回复
用指针变量最好名字里带个p,以后 p++,不要再用数组了
zhao 2013-09-11
  • 打赏
  • 举报
回复
楼主同志str有变化过吗?printf("str[%d]=%c\n",i,*str++);
lm_whales 2013-09-10
  • 打赏
  • 举报
回复
引用 2 楼 u010222864 的回复:
你可以在里面加一个++str就可以了
打算始乱终弃,只用一次吗? 为何不另外定义一个指针. #include<stdio.h> int main(){ const char *str="apple ipod"; const char *s; for(s=str;*s;s++)putchar(*s); putchar('\n'); return 0; }
  • 打赏
  • 举报
回复
引用 12 楼 zaixiankaifa 的回复:
[quote=引用 10 楼 qq523176585 的回复:] [quote=引用 楼主 zaixiankaifa 的回复:] #include <stdio.h> int main() { char *str="apple ipod"; int i; for(i=0;*str!='\0';i++) { printf("str[%d]=%c\n",i,str[i]); } return 0; } 问题: 编译没有问题,但是运行的时候出现数组下标越界的情况,请问为什么? 在循环里面不是已经设置了 " *str!='\0' " ? 为什么还出现这样的下标越界情况? 如果将 *str改成str[i]则不会。
你这个for循环里的*str!='\0'没有起到限定条件的作用,因为str始终指向的是第一个元素。如果你要这么写,你在printf函数前面加一个str++[/quote] 还是想请教一下,既然str[i]里面的i已经++了,那么str的下标也应该++了才对,为什么说str还是指向第一个云元素?[/quote] str是一个指针,指针的值无法通过下标来改变,你改变的只是下标,指针本身的值没有改变啊,比如str[6] = *(str + 6),str的值本身没有变化啊。
zaixiankaifa 2013-09-10
  • 打赏
  • 举报
回复
引用 10 楼 qq523176585 的回复:
[quote=引用 楼主 zaixiankaifa 的回复:] #include <stdio.h> int main() { char *str="apple ipod"; int i; for(i=0;*str!='\0';i++) { printf("str[%d]=%c\n",i,str[i]); } return 0; } 问题: 编译没有问题,但是运行的时候出现数组下标越界的情况,请问为什么? 在循环里面不是已经设置了 " *str!='\0' " ? 为什么还出现这样的下标越界情况? 如果将 *str改成str[i]则不会。
你这个for循环里的*str!='\0'没有起到限定条件的作用,因为str始终指向的是第一个元素。如果你要这么写,你在printf函数前面加一个str++[/quote] 还是想请教一下,既然str[i]里面的i已经++了,那么str的下标也应该++了才对,为什么说str还是指向第一个云元素?
艾薇儿More 2013-09-09
  • 打赏
  • 举报
回复
引用 7 楼 AnYidan 的回复:
for(i=0; str[i] != '\0'; i++)
lz逻辑有错误
max_min_ 2013-09-08
  • 打赏
  • 举报
回复
for(i=0;*str!='\0';i++) //这里一直是成立的啊!所以肯定会越界的! 改成 for(i=0;str[i]!='\0';i++)
引用 楼主 zaixiankaifa 的回复:
#include <stdio.h> int main() { char *str="apple ipod"; int i; for(i=0;*str!='\0';i++) { printf("str[%d]=%c\n",i,str[i]); } return 0; } 问题: 编译没有问题,但是运行的时候出现数组下标越界的情况,请问为什么? 在循环里面不是已经设置了 " *str!='\0' " ? 为什么还出现这样的下标越界情况? 如果将 *str改成str[i]则不会。
  • 打赏
  • 举报
回复
引用 楼主 zaixiankaifa 的回复:
#include <stdio.h> int main() { char *str="apple ipod"; int i; for(i=0;*str!='\0';i++) { printf("str[%d]=%c\n",i,str[i]); } return 0; } 问题: 编译没有问题,但是运行的时候出现数组下标越界的情况,请问为什么? 在循环里面不是已经设置了 " *str!='\0' " ? 为什么还出现这样的下标越界情况? 如果将 *str改成str[i]则不会。
你这个for循环里的*str!='\0'没有起到限定条件的作用,因为str始终指向的是第一个元素。如果你要这么写,你在printf函数前面加一个str++
绵绵糖 2013-09-07
  • 打赏
  • 举报
回复
谢谢大家,学到知识了
AnYidan 2013-09-07
  • 打赏
  • 举报
回复
for(i=0; str[i] != '\0'; i++)
小白也疯狂 2013-09-07
  • 打赏
  • 举报
回复
for(i=0;*str!='\0';i++)
*str是str[0]...so 死循环了
大尾巴猫 2013-09-07
  • 打赏
  • 举报
回复
初学c,对指针了解不深,建议在循环或函数中,要么用指针,要么用下标,不要2者混用。 你在打印值的时候,用了下标方式访问数组str[i],随着i的++,str[i]也不断指向下一个元素。最后数组越界。 但是你判断却用的是*str,应该用str[i]来判断是否结束。在你的循环中,没有用str++来控制str指向下一个元素,所以*str始终是第一个元素的值
宁静的蚂蚁 2013-09-07
  • 打赏
  • 举报
回复
for(i=0;str[i]!='\0';i++) { printf("str[%d]=%c\n",i,str[i]); }
加载更多回复(3)

69,364

社区成员

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

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