C语言中有两个常用的动态内存分配函数:malloc()和calloc()。前者可用于分配指定大小的内存,而后者可以在内存分配的同时将其初始化。
calloc()函数的定义如下:
void *calloc(size_t num, size_t size);
该函数接受两个参数:第一个参数是要分配的元素数量,second参数是每个元素的大小,单位为字节。Calloc()会分配一个块大小为num x size的内存块,并将它的所有比特位设置为0。
在这篇文章里,我们将了解如何使用C语言中的calloc()函数来分配内存并初始化数组。
分配内存
在我们深入讨论之前,让我们先来看一个简单的程序,该程序使用calloc()函数动态分配包含5个整数的数组:
#include
#include
int main()
{
int *p = NULL;
int i, n = 5;
// Using calloc for dynamic memory allocation
p = (int*) calloc(n, sizeof(int));
if (p == NULL)
{
printf("Memory allocation failed!");
exit(0);
}
// Initializing the array
for (i = 0; i < n; i++)
{
p[i] = i + 1;
}
// Printing the array
printf("The array elements are: ");
for (i = 0; i < n; i++)
{
printf("%d ", p[i]);
}
// Freeing the allocated memory
free(p);
return 0;
}
这个程序使用了malloc()函数分配了5个整数所需的内存,并且初始化了数组中的值。在这个例子中,我们首先声明一个指向整型的空指针p,并将其初始化为NULL。接下来,我们使用calloc()分配大小为5个整数的内存,并使用sizeof(int)算出每个整数的大小。在函数返回非NULL指针之后,我们使用for循环初始化数组。最后,我们用free()函数释放了之前分配的内存。
初始化数组
在C语言中,可以使用一个循环来初始化为零的数组。但是,在使用calloc()时,数组的所有元素已经被初始化为0了。因此,不需要为数组分配内存后使用循环来初始化每个元素。
下面是一个示例程序,演示了如何使用calloc()函数来分配并初始化一个字符串数组:
#include
#include
#include
int main()
{
char **str = NULL;
int i;
// Using calloc for dynamic memory allocation
str = (char**)calloc(3, sizeof(char*));
if (str == NULL)
{
printf("Memory allocation failed!");
exit(0);
}
for (i = 0; i < 3; i++)
{
str[i] = (char*)calloc(15, sizeof(char));
if (str[i] == NULL)
{
printf("Memory allocation failed!");
exit(0);
}
}
strcpy(str[0], "Marshmallow");
strcpy(str[1], "Nougat");
strcpy(str[2], "Oreo");
// Printing the array elements
for (i = 0; i < 3; i++)
{
printf("%s ", str[i]);
}
// Freeing the allocated memory
for (i = 0; i < 3; i++)
{
free(str[i]);
}
free(str);
return 0;
}
在这个程序中,我们使用了一个字符串数组,该数组的大小为3。我们使用calloc()函数来动态分配内存,在这种情况下,我们需要动态分配一个指向指针之间的数组,因为每个字符串都是指针。我们首先使用calloc()分配3个元素空间,即3个字符串的空间。之后,我们要注意每个字符串的大小,因为我们将在这些空间中存储字符串。如果我们忘记了这一点,函数将返回一个非NULL的空指针,但该指针可能无法用于正确地存储字符串。
然后,我们使用strcpy()函数将字符串值从常量传递给新分配的内存,并打印所有元素。请注意,我们在使用循环初始化动态数组时不需要循环,因为calloc()将动态数组初始化为零。
最后,我们使用free()函数释放已分配的内存。请注意,我们使用了嵌套的循环来释放指向指针之间的数组。
结论
calloc()是一个在C语言中常用的内存分配函数,它可以分配并初始化内存块。正常情况下,可以使用malloc()和循环来初始化动态数组。但是在某些情况下,calloc()可以使代码更加简洁和易于维护。鉴于C语言的数组在默认情况下未初始化,使用calloc()函数提供了一种简单和有效的方法来为数组分配内存并初始化其所有元素。