C malloc函数大小

C malloc函数大小,c,memory-management,casting,malloc,sizeof,C,Memory Management,Casting,Malloc,Sizeof,所以我有一个棘手的问题需要回答: 如果函数是: void f() { int *c=(int*)malloc(10); } 我想我知道malloc是如何工作的,我查了其他问题,所以这应该分配10个字节的内存并返回第一个字节的地址,再加上它将把它转换为int 因为sizeof(int)是4个字节,所以我认为没有足够的空间容纳9个整数,c+9将指向分配内存范围之外的某个内存,它将返回一个错误,但是没有,程序工作正常,就好像分配了10*sizeof(int)一样。那么我在哪里犯了错误呢

所以我有一个棘手的问题需要回答:

如果函数是:

void f() 
 { 
  int *c=(int*)malloc(10); 
 }
我想我知道malloc是如何工作的,我查了其他问题,所以这应该分配10个字节的内存并返回第一个字节的地址,再加上它将把它转换为int


因为
sizeof(int)
是4个字节,所以我认为没有足够的空间容纳9个整数,c+9将指向分配内存范围之外的某个内存,它将返回一个错误,但是没有,程序工作正常,就好像分配了
10*sizeof(int)
一样。那么我在哪里犯了错误呢?

C程序不会返回错误,如果您超出指定的内存范围。结果没有定义,它可能挂起或(显然)工作正常。但这并不好。

C程序不会返回错误,如果您超出指定的内存范围。结果没有定义,它可能挂起或(显然)工作正常。但它并不好。

你的错误是认为它工作正常

是的,它可能运行,是的,它可能没有故障,但不,它是不正确的

因为sizeof(int)是4字节,所以我认为没有足够的空间容纳9个整数,c+9会指向分配内存范围之外的内存

这是正确的

它将返回一个错误

但不幸的是,这并非在所有情况下都是正确的。操作系统只能以整页的形式提供空间,这意味着您只能以4096字节(一页)的倍数获得空间。这意味着,即使malloc(在用户空间中实现)为您提供10个字节,您的程序也至少有4096个来自操作系统的字节但是:malloc最终会从您得到的这一页中释放出更多未分配的空间,然后可能会引入错误


TLDR:这是UB,即使它看起来很有效,也不要这样做。

你的错误是认为它很好用

是的,它可能运行,是的,它可能没有故障,但不,它是不正确的

因为sizeof(int)是4字节,所以我认为没有足够的空间容纳9个整数,c+9会指向分配内存范围之外的内存

这是正确的

它将返回一个错误

但不幸的是,这并非在所有情况下都是正确的。操作系统只能以整页的形式提供空间,这意味着您只能以4096字节(一页)的倍数获得空间。这意味着,即使malloc(在用户空间中实现)为您提供10个字节,您的程序也至少有4096个来自操作系统的字节但是:malloc最终会从您得到的这一页中释放出更多未分配的空间,然后可能会引入错误


TLDR:这是UB,即使它看起来有效,也不要这样做。

你错误地认为未定义的行为意味着一定会发生“坏”的事情。在您的情况下,访问
c[9]
是未定义的行为,因为您没有
malloc
ed足够的内存,这是您不应该做的事情


未定义的行为意味着标准允许任何行为。对于这个特定的错误,您经常会得到一个非本地化的错误行为,访问
c[9]
显然可以很好地工作,并且当您这样做时不会发生奇怪的事情,但是在一个不相关的代码段中,访问一个不相关的数据段会导致错误。通常,这类错误还会损坏内存分配系统使用的数据,这可能导致
malloc
free
行为不当。

假设未定义的行为意味着一定会发生“不好”的事,这是一个错误。在您的情况下,访问
c[9]
是未定义的行为,因为您没有
malloc
ed足够的内存,这是您不应该做的事情


未定义的行为意味着标准允许任何行为。对于这个特定的错误,您经常会得到一个非本地化的错误行为,访问
c[9]
显然可以很好地工作,并且当您这样做时不会发生奇怪的事情,但是在一个不相关的代码段中,访问一个不相关的数据段会导致错误。通常,此类错误还会损坏内存分配系统使用的数据,这可能导致
malloc
free
行为不当。

你说得对
malloc
给你10个字符(通常是8位字节)。为
int
s分配一个不是
int
size倍数的区域本身就是可疑的。。。但这并不违法。生成的地址被解释为指向
int
(通常为32位)的指针,并且您要求的地址是分配区域开始之外的9
int
。这本身是很好的,但试图接近这是一种未定义的行为:任何事情都可能发生,包括你天真地期望的任何事情,没有任何事情,崩溃,或者终结宇宙。通常会发生的情况是,您从包含其他对象和可用空间的较大区域获得分配的内存(额外的数据
malloc
用于跟踪整个混乱)。在那里读取不会造成伤害,写入可能会损坏其他数据或扰乱malloc的数据结构,导致以后的神秘行为/崩溃。如果幸运的话,新的空间分配在一个边界上,超出限制的访问会产生一个分段错误,指向罪魁祸首。

你是对的,malloc会给你10个字符(通常是8位字节)。为
int
s分配一个不是
int
size倍数的区域本身就是可疑的。。。但这并不违法。结果地址被解释为指向
int
(通常为32位)的指针,您需要地址9
int
beyo