C malloc函数大小

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)分配.那我在哪里弄错了?

tka*_*usl 6

你的错误是相信它运作得很好.

是的,它可能会运行,是的,它可能不是段错误,但不是,它不正确.

因为sizeof(int)是4个字节,我认为没有足够的空间用于9个整数,而c + 9会指向一个超出分配内存范围的内存

这是对的

它会返回一个错误

但遗憾的是,在每种情况下都不正确.操作系统只能在整页中提供空间,这意味着您只能获得4096字节(一页)的倍数空间.这意味着,即使malloc(在用户空间中实现)为您提供10个字节,您的程序也将至少有4096个字节来自操作系统.BUT:的malloc会最终给你出这一个页面,你得到了更多的未分配空间,然后可能引入的错误.

TLDR:这是UB,即使它看起来有效,也绝不会这样做.