2

可以分配多少内存callocmalloc

asmalloc并且calloc可以动态分配内存

例子

void *malloc (size_in_bytes);

并且calloc可以根据块数分配内存

例子

void *calloc (number_of_blocks, size_of_each_block_in_bytes);
4

5 回答 5

4

您可以分配尽可能多的字节,因为类型size_t具有不同的值。所以在 32 位应用程序中它是 4GB 在 64 位 16我什至不知道如何调用这个大小

总而言之,您可以分配机器的所有内存。

于 2013-10-14T19:52:00.003 回答
4

除了受到 PC 中 RAM 数量的限制之外,它还取决于系统,但在 Windows 上,它是_HEAP_MAXREQ根据MSDN 上的文章malloc。请注意malloc,但calloc不保证分配任何东西。这完全取决于执行 PC 上有多少可用内存。

如果内存分配失败或请求的内存量超过 _HEAP_MAXREQ,malloc 会将 errno 设置为 ENOMEM。

_HEAP_MAXREQ定义如下malloc.h(至少在 Visual Studio 2010 中包含)。

#ifdef  _WIN64
#define _HEAP_MAXREQ    0xFFFFFFFFFFFFFFE0
#else
#define _HEAP_MAXREQ    0xFFFFFFE0
#endif

不过,您不应该真正担心这一点。使用时,malloc您应该确定您真正需要多少内存,并将其作为请求调用。如果系统无法提供,malloc将返回NULL。在你打电话给你之后,malloc你应该经常检查它是否不是NULL。这是 MSDN 文章中关于正确使用的 C 示例。另请注意,一旦您完成了内存,您需要调用free.

#include <stdlib.h>   // For _MAX_PATH definition
#include <stdio.h>
#include <malloc.h>

int main( void )
{
   char *string;

   // Allocate space for a path name
   string = malloc( _MAX_PATH );

   // In a C++ file, explicitly cast malloc's return.  For example, 
   // string = (char *)malloc( _MAX_PATH );

   if( string == NULL )
      printf( "Insufficient memory available\n" );
   else
   {
      printf( "Memory space allocated for path name\n" );
      free( string );
      printf( "Memory freed\n" );
   }
}    
于 2013-10-14T19:41:23.317 回答
1

就语言定义而言,每次调用的唯一上限是size_t支持的内容(例如,如果最大值size_t是 2 32malloc -1,那么这是可以为单个块分配 的最大字节数)。

您是否拥有可用于成功调用此类调用的资源取决于实施和底层系统。

于 2013-10-14T20:04:17.033 回答
0

On linux, indefinite amounts, i. e. much more than you have either physical or virtual memory.

As long, as you don't actually use it, you're fine, it's just when you actually use more memory than available that the out-of-memory killer starts running amok, and shoots down your process.

This is the reason why many people don't bother checking the result of malloc() anymore, because it's not null even when the returned buffer can never be backed...

于 2013-10-14T19:45:17.953 回答
0

1) 这取决于用户的资源限制。2) 它还取决于地址空间的可用性。

于 2014-03-18T10:50:32.190 回答