Neb*_*ski 0 c malloc memory-management casting sizeof
所以我有一个我需要回答的棘手问题:
在内存中哪个段是c + 9指向函数是否:
void f()
{
int *c=(int*)malloc(10);
}
Run Code Online (Sandbox Code Playgroud)
我想我知道malloc是如何工作的,我查找了其他问题,所以这应该分配10个字节的内存并返回第一个的地址,加上它会将它转换为int.
因为sizeof(int)
是4个字节,我认为没有足够的空间用于9个整数,并且c + 9指向超出分配内存范围的一些内存并且它将返回错误,但是不,程序正常工作很好,好像有10*sizeof(int)
分配.那我在哪里弄错了?
你的错误是相信它运作得很好.
是的,它可能会运行,是的,它可能不是段错误,但不是,它不正确.
因为sizeof(int)是4个字节,我认为没有足够的空间用于9个整数,而c + 9会指向一个超出分配内存范围的内存
这是对的
它会返回一个错误
但遗憾的是,在每种情况下都不正确.操作系统只能在整页中提供空间,这意味着您只能获得4096字节(一页)的倍数空间.这意味着,即使malloc(在用户空间中实现)为您提供10个字节,您的程序也将至少有4096个字节来自操作系统.BUT:的malloc会最终给你出这一个页面,你得到了更多的未分配空间,然后将可能引入的错误.
TLDR:这是UB,即使它看起来有效,也绝不会这样做.
归档时间: |
|
查看次数: |
411 次 |
最近记录: |