1

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

例子:

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

每次在我的电脑上都会给我8个吗?

4

4 回答 4

4

如果你不这样做malloc,它仍然会给你 8。因为它根本与 malloc 无关!

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

注意:在 C++ 中,sizeof始终是编译时常量。在 C 中,对于可变长度数组有一种特殊情况,即返回数组的实际运行时大小。但是 C++ 没有可变长度数组,所以你不必为这种特殊情况而烦恼。

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

于 2013-11-05T10:47:33.700 回答
3

没有标准的方法可以准确地知道运行时在幕后保留了多少内存。甚至也没有一种标准方法可以找出您最初要求的金额。(如果你需要记住这一点,你需要自己存储它。)

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

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

于 2013-11-05T10:50:13.053 回答
1

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

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

sizeof(myint)然而,在您的代码中返回指针的大小,无法知道实际分配的内存块的实际大小(这是留给 malloc 实现的细节)。从返回的值中您所知道的(可移植的)malloc是它有足够的内存(即不少于您要求的内存)并且可以用于存储任何基本类型(它尊重平台上最严格的对齐方式)。

于 2013-11-05T10:48:51.610 回答
0

这是因为您正在找出指针的大小而不是分配的内存的大小

于 2013-11-05T10:53:14.740 回答