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));
是否等同?
答案 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中,您不应该转换malloc
,calloc
和realloc
的返回值。
答案 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-10
或int
。在任何一种情况下,它都会分配一个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))
。此函数将您要分配的字节数作为输入。您是否通过20
或int
(假设您的计算机上4
为char *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)
是的。 malloc将分配连续的块,或者如果没有足够大的连续块,则malloc将失败。 (malloc失败将返回NULL指针。)
Malloc和Calloc都分配了内存但calloc初始化为零,而malloc则没有。