C语言中的malloc()混淆,动态内存分配

时间:2017-08-17 10:36:38

标签: c

int* ptr;
ptr=(int*)malloc(sizeof(int)); //(A)
ptr=(int*)malloc(5*sizeof(int)); //(B)

在第(A)行,将动态创建一个4字节的块。现在没关系。但我的问题是在B行是否会创建一个20(5 * 4)字节块?或5个独立的大小为4字节的块?如果它创建一个单独的块,那么它们是连续的吗? ptr=(int*)malloc(5*sizeof(int)); and ptr=(int*)calloc(5,sizeof(int));是否等同?

6 个答案:

答案 0 :(得分:2)

它们几乎相同。 malloc将分配连续的块。 不同之处在于calloc对内存进行了零初始化,而malloc则没有。

当然,我们正在谈论虚拟内存。该块将与您的程序连续。它可能不在物理内存中。但在大多数情况下,这并不重要,除非你不尝试做内核模块或驱动程序,它们在第0环中工作。但这是不同的故事。

答案 1 :(得分:2)

  

但我的问题是在B行是否会创建一个20(5 * 4)字节块?

ptr = malloc(5*sizeof(int))将分配5*sizeof(int)个字节的空间。是分配的空间将是连续的,如果连续的空间不可用,则分配将失败。

  

ptr=(int*)malloc(5*sizeof(int));ptr=(int*)calloc(5,sizeof(int));是否相同?

它们是等效的,只是calloc将分配的内存设置为0

注意:在C中,您不应该转换malloccallocrealloc的返回值。

答案 2 :(得分:2)

malloc()尝试分配您要求的内存大小。该函数不知道参数是如何传递的,而是单独的值。

例如,如果sizeof(int)为4,则:

int* ptr = malloc(sizeof(int) * 5);

int* ptr = malloc(20);

基本相同。在这两个函数中都会得到一个值为20的参数。如果你像这样调用malloc会发生同样的情况:

size_t a = 20;
int* ptr = malloc(a);

因此,如果成功(即不返回NULL),它将分配一个连续的内存块,至少具有您要求的大小。

关于虚拟内存的一切都是如此。这意味着,您将使用连续索引访问内存。物理内存取决于操作系统管理内存的方式。

例如,如果您的操作系统仅保留4kb大小的内存页帧(物理内存块),并且您在malloc中要求更多,尽管您的虚拟内存将是连续的,但物理内存可能不会。

所有这一切都与更广泛的主题有关,称为内存管理。您可以阅读linux选择处理它的方式here

答案 3 :(得分:1)

Malloc获取要分配的块大小,以字节为单位表示。它不会(并且不能,真的)确定您获得给定数字的方式,例如,如您的示例中的大小是20,还是30-10int。在任何一种情况下,它都会分配一个20字节的块(假设 <td colspan="3" class="table-info"><div class="ck"> <label><input type="radio" name="attendance[<?php echo $_SESSION['i']?>]" id="attendance[<?php echo $_SESSION['i']?>]" value="Yes">Yes</label> <label><input type="radio" name="attendance[<?php echo $_SESSION['i']?>]" id="attendance[<?php echo $_SESSION['i']?>]" value="No">No</label></td> <?php $_SESSION['i']++; ?> 的大小是4字节)。

答案 4 :(得分:0)

首先,bad to cast malloc()的返回值。(5*sizeof(int))。此函数将您要分配的字节数作为输入。您是否通过20int(假设您的计算机上4char *ptr = malloc(5*sizeof(int)); ptr++; // now ptr points to the second byte of the chunk. 字节并不重要。将分配具有给定字节数的块。当我说chunk时,我的意思是你可以像这样访问每个字节:

int *ptr = malloc(5*sizeof(int));
ptr++;  // now ptr points to the second element (that's sizeof (int) bytes away) from the start of the chunk.

或者,您可以这样做:

malloc
  

是ptr =(int *)malloc(5 * sizeof(int));和   PTR =(INT *)释放calloc(5,的sizeof(INT));等效?

使用calloc时,不应该假设内存块的内容。使用0时,块中的所有字节都保证设置为malloc。在某些实现中,calloc 可能5*sizeof(int)更快。除此之外没有区别。

答案 5 :(得分:0)

  1. 是的。 malloc将分配连续的块,或者如果没有足够大的连续块,则malloc将失败。 (malloc失败将返回NULL指针。)

  2. Malloc和Calloc都分配了内存但calloc初始化为零,而malloc则没有。