user-0 提问: c语言基础问题

回复:
user: user-1
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #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; }

user: user-2
content: 引用 8 楼 fantasy408 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] 越界访问的操作，应该是未定义行为。如果想知道a[5]应该是什么值，建议查看栈信息，可以获知数组偏移下一个整型数的值。 有可能是i的值，因为定义a[5]之后（分配空间），就定义了i，所以i在数组之后分配空间。 但是，对于越界操作还是不确定的，越界可能导致程序崩溃 非常感谢您，a[5]确实跟i是重合的[/quote] 这个重合不一定总是出现的，所以我们还是要做到对数组不做越界访问

user: user-0
content: 引用 6 楼 cfjtaishan 的回复:越界访问的操作，应该是未定义行为。如果想知道a[5]应该是什么值，建议查看栈信息，可以获知数组偏移下一个整型数的值。 有可能是i的值，因为定义a[5]之后（分配空间），就定义了i，所以i在数组之后分配空间。 但是，对于越界操作还是不确定的，越界可能导致程序崩溃 非常感谢您，a[5]确实跟i是重合的

user: user-0
content: 引用 5 楼 qq_38204686 的回复:a[5]  其实就是i  这样就可以解释了吧 它俩指向同一片内存 说明它们分配内存时应该是连续的 get了，非常感谢您！ 书上的内容还是得多练多想才能很好的理解

user: user-2
content: 越界访问的操作，应该是未定义行为。如果想知道a[5]应该是什么值，建议查看栈信息，可以获知数组偏移下一个整型数的值。 有可能是i的值，因为定义a[5]之后（分配空间），就定义了i，所以i在数组之后分配空间。 但是，对于越界操作还是不确定的，越界可能导致程序崩溃

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #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; }  谢谢指点! 只是...您给的例子太高级了，我这个水平还无法看懂

user: user-0
content: 引用 9 楼 cfjtaishan 的回复:[quote=引用 8 楼 fantasy408 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] 越界访问的操作，应该是未定义行为。如果想知道a[5]应该是什么值，建议查看栈信息，可以获知数组偏移下一个整型数的值。 有可能是i的值，因为定义a[5]之后（分配空间），就定义了i，所以i在数组之后分配空间。 但是，对于越界操作还是不确定的，越界可能导致程序崩溃 非常感谢您，a[5]确实跟i是重合的[/quote] 这个重合不一定总是出现的，所以我们还是要做到对数组不做越界访问[/quote] 谢谢提醒

user: user-3
content: a[5]  其实就是i  这样就可以解释了吧 它俩指向同一片内存 说明它们分配内存时应该是连续的

user: user-3
content: 引用 3 楼 fantasy408的回复:[quote=引用 1 楼 qq_38204686 的回复:] [里面的数字]是偏移量  指向的内存里面肯定是有数据的  只是你没有分配而已 但它一直存在 您好，我在debug它时，观察a[5]，发现只要i为几，a[5]就为几，单步运行时，a[5]随i动态变化，不知是怎么回事...[/quote] 没准那个内存指向的就是i呢

user: user-0
content: 引用 1 楼 qq_38204686 的回复:[里面的数字]是偏移量  指向的内存里面肯定是有数据的  只是你没有分配而已 但它一直存在 您好，我在debug它时，观察a[5]，发现只要i为几，a[5]就为几，单步运行时，a[5]随i动态变化，不知是怎么回事...

user: user-4
content: 过来学习学习，膜拜各位大神

user: user-3
content: [里面的数字]是偏移量  指向的内存里面肯定是有数据的  只是你没有分配而已 但它一直存在