如您所知,数组是固定数量的值的集合。声明数组的大小后,您将无法更改它。
有时,您声明的数组大小可能不足。要解决此问题,您可以在运行时手动分配内存。这在C编程中称为动态内存分配。
为了动态分配内存,库函数使用malloc()
, calloc()
, realloc()
和free()
。这些功能在
头文件中定义。
C malloc()
名称“ malloc”代表内存分配。
malloc()
函数保留一个指定字节数的内存块。并且,它返回一个void
指针,该指针可以转换为任何形式的指针。
malloc()的语法
ptr = (castType*) malloc(size);
例
ptr = (float*) malloc(100 * sizeof(float));
上面的语句分配了400个字节的内存。这是因为float
的大小是4个字节。并且,指针ptr保存分配的存储器中的第一个字节的地址。
如果无法分配内存,则表达式将导致NULL
指针。
C calloc()
名称“ calloc”代表连续分配。
malloc()
函数分配内存,并保留未初始化的内存。而calloc()
函数分配内存并将所有位初始化为零。
calloc()的语法
ptr = (castType*)calloc(n, size);
例:
ptr = (float*) calloc(25, sizeof(float));
上面的语句在内存中为float
类型的25个元素分配了连续的空间。
C free()
用calloc()
或malloc()
创建的动态分配内存不会自行释放。您必须显式使用free()
释放空间。
free()的语法
free(ptr);
该语句释放由ptr
指向的内存中分配的空间。
示例1:malloc()和free()
// Program to calculate the sum of n numbers entered by the user
#include
#include
int main()
{
int n, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int*) malloc(n * sizeof(int));
// if memory cannot be allocated
if(ptr == NULL)
{
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for(i = 0; i < n; ++i)
{
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
// deallocating the memory
free(ptr);
return 0;
}
在这里,我们为n个int
动态分配了内存。
示例2:calloc()和free()
// Program to calculate the sum of n numbers entered by the user
#include
#include
int main()
{
int n, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int*) calloc(n, sizeof(int));
if(ptr == NULL)
{
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for(i = 0; i < n; ++i)
{
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
free(ptr);
return 0;
}
C realloc()
如果动态分配的内存不足或超过要求,则可以使用realloc()
函数更改先前分配的内存大小。
realloc()的语法
ptr = realloc(ptr, x);
在这里,以新的大小x重新分配ptr 。
示例3:realloc()
#include
#include
int main()
{
int *ptr, i , n1, n2;
printf("Enter size: ");
scanf("%d", &n1);
ptr = (int*) malloc(n1 * sizeof(int));
printf("Addresses of previously allocated memory: ");
for(i = 0; i < n1; ++i)
printf("%u\n",ptr + i);
printf("\nEnter the new size: ");
scanf("%d", &n2);
// rellocating the memory
ptr = realloc(ptr, n2 * sizeof(int));
printf("Addresses of newly allocated memory: ");
for(i = 0; i < n2; ++i)
printf("%u\n", ptr + i);
free(ptr);
return 0;
}
运行该程序时,输出为:
Enter size: 2
Addresses of previously allocated memory:26855472
26855476
Enter the new size: 4
Addresses of newly allocated memory:26855472
26855476
26855480
26855484