C编程Malloc的操作不正确[重复]

问题描述 投票:0回答:2

当我创建动态数组时:

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 linux malloc dynamic-memory-allocation
2个回答
1
投票

如上面的评论中所述,C是not一种“边界检查”语言(如果您需要这种语言,那么可以选择许多替代方法,从D到Nim,也可以是容易与纯ANSI C混合)。

现在,回到您的问题。

您所做的是为4个整数分配一些内存。到目前为止一切顺利。

您可以访问内存的其他部分(或比最初分配的内存更多的内存-请参阅:超出范围)并摆脱它的事实,并不意味着您应该这样做。它可能会崩溃,也可能不会崩溃。这就是所谓的“未定义行为”。

现在,如果您想成为安全方面,请按照您应该做的方式进行操作:

  1. 首先分配​​您需要的内存
  2. 访问它-总是在范围内
  3. 完成后将其释放

0
投票

C对阵列的限制不承担任何责任。如果要确保不超出分配的空间,则需要创建一个代表分配的空间大小的变量,并在malloc命令和for循环中都使用它。

您对C的理解需要提高,因此您了解使用低级语言的方式有其局限性和责任。

C对字符数组进行伪内存检查,方法是在每个“字符串”的末尾添加一个空(0),但这仅适用于某些方法和技术。

© www.soinside.com 2019 - 2024. All rights reserved.