user-0 提问: 结构体中的成员数组的下标可以大于数组的长度吗

回复:
user: user-1
content: 你这块内存是在堆里面分配的，导致没有错误的原因可能有两个： 1. 堆的算法，一个内存申请经常会多给你一些内存，不是好意，是和具体的堆管理算法有关，举个例子，如果堆对于小内存申请有时候为了计算方便会固定的给你 16，,32，64，等字节，也就是说，比如你申请了 33自己，堆很可能会给你 64 字节，因为为了分配和回收算法等一系列原因，堆经常是把固定大小的字节块串成一串，比如16字节的是一串，32字节的是一串，64字节的是一串。堆在数据结构中就是一个或者几个大的链表。  2. 看程序你的内存只有申请没有释放也没有申请其他内存，通常程序崩溃是在 free 的过程，或者有人再次申请内存时候，本身的胡乱操作不会导致崩溃，崩溃的原因是，你越界以后会破坏整个堆的结构，因为你每块申请到的内存前面都有一个内存控制块，这个块就是刚才说的堆的链表指针等等，所以越界会破坏这个链表，导致不可知的非法访问，如果你访问到了小地址或者其他不属于该程序地址空间的地址，CPU就会出异常，你的程序就挂了。

user: user-2
content: 数组范围需要你来控制, 如果你不控制, 要么正常, 要么错误, 要么程序挂掉 for(int i=1;i<=16;i++)  改为10

user: user-3
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-0
content: http://www.guokr.com/blog/471312/

user: user-1
content: 引用 15 楼 hanxia12356789 的回复:[quote=引用 14 楼 liutao_1977 的回复:] 建议楼主，请仔细看我的回复，因为我实现过保护模式下操作系统内核的堆。  谢谢，已经仔细看过了，还是对堆内存的管理有点模糊，能不能推荐些这方面的资料[/quote]  http://bbs.csdn.net/topics/391844682?page=1#post-400484115 这是我写的帖子，详细解释了堆，你先看看有没有帮助

user: user-0
content: 引用 14 楼 liutao_1977 的回复:建议楼主，请仔细看我的回复，因为我实现过保护模式下操作系统内核的堆。  谢谢，已经仔细看过了，还是对堆内存的管理有点模糊，能不能推荐些这方面的资料

user: user-1
content: 建议楼主，请仔细看我的回复，因为我实现过保护模式下操作系统内核的堆。

user: user-4
content: 没问题只是运气好，如果越界的内存刚好用于其他操作，就可能出现问题了。。

user: user-5
content: 数组下标有效值是 [0,n-1]，除此之外的都会导致未定义行为。

user: user-6
content: 引用 5 楼 hanxia12356789 的回复:[quote=引用 4 楼 fefe82 的回复:] [quote=引用 3 楼 hanxia12356789 的回复:] [quote=引用 2 楼 fefe82 的回复:] [quote=引用 1 楼 fefe82 的回复:] 你的代码呢？  ==================  一般来说，数组的引用下标竟然可以超过数组的长度是错误的，不管是不是结构体成员。（当然存在一些特殊用法，没看到你的程序不讨论）  错误的程序的结果是“不可预测”的。不可预测就意味着它可能产生你期望的“正确结果”，也可能崩溃，也可能给出一个结果但是是错误，也可能被编译器直接拒绝给出一个错误，等等。  刚才没看到你的代码。你的程序不涉及特殊用法，是错误的。你需要增加 Maxsize 。[/quote]   你需要增加 Maxsize是什么意思，Maxsize已经在开头宏定义了[/quote]  既然你需要用到 element[16] ，那就至少把 Maxsize 改成 17 。[/quote] 但是为什么Maxsize是10的时候编译运行并没有报错呢，而下面的代码，当下标超过数组长度的时候就会报错 #include<iostream> using namespace std; int main() { 	int a1[10]; 	for(int i=0;i<=10;i++) 	{ 		a1[i]=i; 	} }[/quote] 这就叫 不可预测。 你不知道它什么时候会出错，什么时候会崩溃。

user: user-7
content: 超出的16 - 10 的int，你没有给出定义，但你的程序可以访问，而其它地方也不会访问它，越出了但结果不出错。当你(struct Node *)malloc (sizeof(struct Node) * 2)，你看下一个node会不会出现问题。

user: user-0
content: 引用 4 楼 fefe82 的回复:[quote=引用 3 楼 hanxia12356789 的回复:] [quote=引用 2 楼 fefe82 的回复:] [quote=引用 1 楼 fefe82 的回复:] 你的代码呢？  ==================  一般来说，数组的引用下标竟然可以超过数组的长度是错误的，不管是不是结构体成员。（当然存在一些特殊用法，没看到你的程序不讨论）  错误的程序的结果是“不可预测”的。不可预测就意味着它可能产生你期望的“正确结果”，也可能崩溃，也可能给出一个结果但是是错误，也可能被编译器直接拒绝给出一个错误，等等。  刚才没看到你的代码。你的程序不涉及特殊用法，是错误的。你需要增加 Maxsize 。[/quote]   你需要增加 Maxsize是什么意思，Maxsize已经在开头宏定义了[/quote]  既然你需要用到 element[16] ，那就至少把 Maxsize 改成 17 。[/quote] 但是为什么Maxsize是10的时候编译运行并没有报错呢，而下面的代码，当下标超过数组长度的时候就会报错 #include<iostream> using namespace std; int main() { 	int a1[10]; 	for(int i=0;i<=10;i++) 	{ 		a1[i]=i; 	} }

user: user-6
content: 引用 3 楼 hanxia12356789 的回复:[quote=引用 2 楼 fefe82 的回复:] [quote=引用 1 楼 fefe82 的回复:] 你的代码呢？  ==================  一般来说，数组的引用下标竟然可以超过数组的长度是错误的，不管是不是结构体成员。（当然存在一些特殊用法，没看到你的程序不讨论）  错误的程序的结果是“不可预测”的。不可预测就意味着它可能产生你期望的“正确结果”，也可能崩溃，也可能给出一个结果但是是错误，也可能被编译器直接拒绝给出一个错误，等等。  刚才没看到你的代码。你的程序不涉及特殊用法，是错误的。你需要增加 Maxsize 。[/quote]   你需要增加 Maxsize是什么意思，Maxsize已经在开头宏定义了[/quote]  既然你需要用到 element[16] ，那就至少把 Maxsize 改成 17 。

user: user-0
content: 引用 2 楼 fefe82 的回复:[quote=引用 1 楼 fefe82 的回复:] 你的代码呢？  ==================  一般来说，数组的引用下标竟然可以超过数组的长度是错误的，不管是不是结构体成员。（当然存在一些特殊用法，没看到你的程序不讨论）  错误的程序的结果是“不可预测”的。不可预测就意味着它可能产生你期望的“正确结果”，也可能崩溃，也可能给出一个结果但是是错误，也可能被编译器直接拒绝给出一个错误，等等。  刚才没看到你的代码。你的程序不涉及特殊用法，是错误的。你需要增加 Maxsize 。[/quote]   你需要增加 Maxsize是什么意思，Maxsize已经在开头宏定义了

user: user-6
content: 你的代码呢？  ==================  一般来说，数组的引用下标竟然可以超过数组的长度是错误的，不管是不是结构体成员。（当然存在一些特殊用法，没看到你的程序不讨论）  错误的程序的结果是“不可预测”的。不可预测就意味着它可能产生你期望的“正确结果”，也可能崩溃，也可能给出一个结果但是是错误，也可能被编译器直接拒绝给出一个错误，等等。

user: user-6
content: 引用 1 楼 fefe82 的回复:你的代码呢？  ==================  一般来说，数组的引用下标竟然可以超过数组的长度是错误的，不管是不是结构体成员。（当然存在一些特殊用法，没看到你的程序不讨论）  错误的程序的结果是“不可预测”的。不可预测就意味着它可能产生你期望的“正确结果”，也可能崩溃，也可能给出一个结果但是是错误，也可能被编译器直接拒绝给出一个错误，等等。  刚才没看到你的代码。你的程序不涉及特殊用法，是错误的。你需要增加 Maxsize 。