在数组越界赋值操作中,如何避免陷入无限循环?

更新于
2026-10-10 03:00:52
2阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计326个文字,预计阅读时间需要2分钟。

在数组越界赋值操作中,如何避免陷入无限循环?

“选自《C语言陷阱与缺陷》+

选自《C语言陷阱与缺陷》

#include <stdio.h> int main() { int i = 0; int arr[] = {1,2,3,4,5,6,7,8,9,10}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hello world\n"); } return 0; }

在vs、x86、C语言环境下运行这串代码,将会死循环地打印hello world。

在数组越界赋值操作中,如何避免陷入无限循环?

原因

内存的使用是从高地址到低地址使用的

i先被创建,放在了高地址处

数组在内存中的使用是,下标增大,地址随之增大

arr后创建,放在比i的地址低的位置

在vs、x86、C语言环境下,相邻创建的变量中间会相隔两个整形大小的空间,因为i先创建,并且与arr相邻创建,所以i的地址和arr最后元素的地址+两个整形空间的地址是一样的

当arr进行越界访问时,将会导致越界时触碰到i的地址

当i在循环中被改变时,for循环如果不能被中断,就会死循环

由上图可知,因为两个变量之间相隔两个整形的大小,所以,arr[12]的地址和i的地址是相同的,当赋值arr[12]=0后,i也会变成0,陷入死循环

【本文转自:美国服务器 www.558idc.com/mg.html欢迎留下您的宝贵建议

本文共计326个文字,预计阅读时间需要2分钟。

在数组越界赋值操作中,如何避免陷入无限循环?

“选自《C语言陷阱与缺陷》+

选自《C语言陷阱与缺陷》

#include <stdio.h> int main() { int i = 0; int arr[] = {1,2,3,4,5,6,7,8,9,10}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hello world\n"); } return 0; }

在vs、x86、C语言环境下运行这串代码,将会死循环地打印hello world。

在数组越界赋值操作中,如何避免陷入无限循环?

原因

内存的使用是从高地址到低地址使用的

i先被创建,放在了高地址处

数组在内存中的使用是,下标增大,地址随之增大

arr后创建,放在比i的地址低的位置

在vs、x86、C语言环境下,相邻创建的变量中间会相隔两个整形大小的空间,因为i先创建,并且与arr相邻创建,所以i的地址和arr最后元素的地址+两个整形空间的地址是一样的

当arr进行越界访问时,将会导致越界时触碰到i的地址

当i在循环中被改变时,for循环如果不能被中断,就会死循环

由上图可知,因为两个变量之间相隔两个整形的大小,所以,arr[12]的地址和i的地址是相同的,当赋值arr[12]=0后,i也会变成0,陷入死循环

【本文转自:美国服务器 www.558idc.com/mg.html欢迎留下您的宝贵建议