当我创建动态数组时:
int *arr = (int *) malloc( 4 * sizeof(int) );
因此,它应该像4个整数一样保存(对于空间问题,可能还要多2个或3个)但是为什么行得通:
for ( int x = 0; x < 30000; x++) {
arr[x] = x;
}
我是说30.000个变量应该没有太大的空间,它的工作原理还不错,可能是什么原因?它会像c ++ std :: vector一样自动重新分配,或者我怎么理解它?
如果将循环范围设置为50.000,它将崩溃,但它甚至应崩溃,就像在索引a [100]或之前,因为数组大4个元素。
如果有问题,我正在使用gnu / linux。
我尽力理解它。
请帮助
如上面的评论中所述,C是not一种“边界检查”语言(如果您需要这种语言,那么可以选择许多替代方法,从D到Nim,也可以是容易与纯ANSI C混合)。
现在,回到您的问题。
您所做的是为4个整数分配一些内存。到目前为止一切顺利。
您可以访问内存的其他部分(或比最初分配的内存更多的内存-请参阅:超出范围)并摆脱它的事实,并不意味着您应该这样做。它可能会崩溃,也可能不会崩溃。这就是所谓的“未定义行为”。
现在,如果您想成为安全方面,请按照您应该做的方式进行操作:
C对阵列的限制不承担任何责任。如果要确保不超出分配的空间,则需要创建一个代表分配的空间大小的变量,并在malloc命令和for循环中都使用它。
您对C的理解需要提高,因此您了解使用低级语言的方式有其局限性和责任。
C对字符数组进行伪内存检查,方法是在每个“字符串”的末尾添加一个空(0),但这仅适用于某些方法和技术。