此代码:
# 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
1条答案
按热度按时间j91ykkif1#
访问无效内存是undefined behaviour。
试图访问未分配给程序的内存位置是无效的内存访问。在您的情况下,索引值〉7(因为C使用基于0的索引)将导致UB。