进入超出分配的空间而不会出现段错误

时间:2017-10-11 22:13:37

标签: c pointers undefined-behavior

我为char指针分配了一些空间,并尝试访问超出分配的空间但仍然没有分段错误。我的代码如下:

canvas.getBoundingClientRect().left

现在我的问题是:我怎样才能超越分配的空间?我不应该得到分段错误吗?

2 个答案:

答案 0 :(得分:1)

当您在此处完成时,当您在malloc分配的内存块的末尾写入时,您将调用undefined behavior

未定义的行为意味着无法预测程序的行为。它可能崩溃,它可能会输出奇怪的结果,或者它似乎可以正常工作。此外,一个看似无关的更改,例如添加未使用的局部变量或调用printf进行调试,可能会改变未定义行为的显示方式。

总结一下,对于未定义的行为,仅仅因为程序崩溃并不意味着它会发生。

答案 1 :(得分:0)

malloc()函数实现是特定于系统和库的。许多内存分配实现必须处理的事情之一是内存碎片。

问题代码分配4个字节。为了最小化内存碎片,许多系统实际分配超过4个;也许最少16个字节。这样做既满足malloc(4)请求,又保留内存片段(一旦释放内存),最小大小为16字节。因此,可以使用16字节片段的“存储器片段池”来满足1到16字节的malloc()请求。

许多内存管理系统维护每个16,32,64,128(等)字节的“内存片段池”。例如,如果调用malloc(44),则64字节池中的内存片段可以满足请求。

在某些系统上,有一个规定来确定malloc()返回的内存片段的实际大小。在Linux系统上,函数malloc_usable_size()执行此功能。 OS X系统可以使用malloc_size()。