越界访问数组赋值,为何陷入死循环无法自拔?
- 内容介绍
- 文章标签
- 相关推荐
本文共计423个文字,预计阅读时间需要2分钟。
选自《C语言陷阱与缺陷》开头内容:
在C语言的世界里,程序员常常会遇到各种意想不到的陷阱和缺陷。这些陷阱和缺陷可能隐藏在看似简单的代码中,导致程序出现不可预测的行为或错误。本书旨在帮助读者深入了解C语言的这些陷阱和缺陷,提高编程技能,避免在编写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,陷入死循环
本文共计423个文字,预计阅读时间需要2分钟。
选自《C语言陷阱与缺陷》开头内容:
在C语言的世界里,程序员常常会遇到各种意想不到的陷阱和缺陷。这些陷阱和缺陷可能隐藏在看似简单的代码中,导致程序出现不可预测的行为或错误。本书旨在帮助读者深入了解C语言的这些陷阱和缺陷,提高编程技能,避免在编写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,陷入死循环

