malloc()非确定性行为

时间:2013-11-05 10:44:57

标签: c++ pointers memory malloc

据我所知,malloc()至少分配了所需的大小,因此它可以提供更多。问题是它是否会在同一架构中至少提供相同的内存大小?

示例:

int * myint = (int*)malloc(sizeof(int))
sizeof(myint)  //---> this gives me 8

每次在我的电脑里它会给我8个吗?

4 个答案:

答案 0 :(得分:4)

如果你没有malloc,它仍会给你8.因为它与malloc完全无关!

sizeof是一个编译时常量,它告诉您存储参数类型实例所需的大小。参数类型为int *,您的编译器显然编译为64位,因此指针占用8个字节。

注意:在C ++中,sizeof始终是编译时常量。在C中,有一个特殊情况可变长度数组,其中返回数组的实际运行时大小。但是C ++没有可变长度数组,所以你不必费心这个特殊情况。

另一个注意事项:在C ++中,你应该使用vector和其他集合,如果所有其他集合都失败了(不幸的是make_uniquenew,但通常不是{{1} }}

答案 1 :(得分:3)

没有标准方法可以确切知道运行时在幕后保留了多少内存。甚至没有一种标准的方法可以找出你原来要求的数量。 (如果你需要记住这个,你需要自己存储它。)

给定的实现可能会准确保留您要求的内容或更高的数量,并且可能会不时变化。但你既不知道也不关心。

正如其他人所指出的,在您的代码中,您实际上是在询问int*指针的大小而不是分配块的大小。

答案 2 :(得分:1)

sizeof将始终在给定的编译中返回相同的值,因为它是编译时的值(在运行程序时不确定。

但请注意,例如我的64位ubuntu机器也可以运行32位代码,某些类型的大小将根据我是否要编译32位可执行文件而改变(例如gcc -m32 ...)或64位可执行文件。因此sizeof返回的值可能取决于编译选项。

但是,代码中的

sizeof(myint)返回指针的大小,无法知道实际分配的内存块的实际大小(这是一个留给malloc实现的细节)。从malloc返回的值中你所知道的(便携式)是它有足够的内存(即不低于你的要求)并且可用于存储任何基本类型(它尊重平台上最严格的对齐) )。

答案 3 :(得分:0)

这是因为你发现指针的大小不是分配内存的大小