linux 为什么可以写入从malloc传递到已分配内存的数组?

mnemlml8  于 2022-11-02  发布在  Linux
关注(0)|答案(1)|浏览(119)

此代码:


# include <stdio.h>

# include <stdlib.h>

int main()
{
  int n = 8;
  int *ar = malloc(sizeof(int) * n);
  for (int i = 0; i < 33624; i++)
  {
    ar[i] = i;
    // printf("%d\n", ar[i]);
  }

  // ar = realloc(ar, sizeof(int) * 10);
}

允许我写入33623*4(sizeof int)字节通过分配的内存。尝试访问33624会导致segfault。为什么我可以这样做,为什么33623的限制专门针对8*4字节分配?
接下来,即使在“写入通过允许的边界”之后也使用realloc,这在以前不会导致segfault(如果小于33624),现在也会导致

realloc(): invalid next size
Aborted (core dumped)

不管我提供什么大小参数(你可以在注解中看到新的大小只是10个整数),那么realloc是如何知道写操作通过边界的呢?
我这样问是因为如果作为程序员我要求从malloc中得到100个字节,但它给了我更多--因为这是上面的参数“写入通过允许边界的可能性”,我没有理由realloc,因为分配的大小比请求的大。
因此,如果我可以从请求的大小中得出malloc提供的真实大小(同样,请求的8*4与segfault之前允许的最后一个内存位置访问4*33623之间的关系是什么),我就可以使用此大小进行计算,而根本不使用realloc

j91ykkif

j91ykkif1#

访问无效内存是undefined behaviour

试图访问未分配给程序的内存位置是无效的内存访问。在您的情况下,索引值〉7(因为C使用基于0的索引)将导致UB。

相关问题