学习C – C malloc
你也可以显式地在运行时分配内存。
你也可以显式地在运行时分配内存。…
当你使用 malloc()
函数,指定内存的字节数你想要分配作为参数。
该函数返回它的内存的第一个字节的地址分配响应您的请求。
动态内存分配的一个典型示例可能是:
int *pNumber = (int*)malloc(100);
这里,您请求了100字节的内存,并将此内存块的地址分配给pNumber。
以下代码分配内存以容纳25个整数。
int *pNumber = (int*)malloc(25*sizeof(int));
(int *)
将函数返回的地址转换为int类型的指针。
#include <stdio.h>
#include <stdlib.h>
main()
{
char *name;
name = (char *) malloc(80*sizeof(char));
if ( name != NULL ) {
printf("\nEnter your name: ");
gets(name);
printf("\nHi %s\n", name);
free(name); //free memory resources
} // end if
} //end main
上面的代码生成以下结果。
免费和malloc
下面的代码显示了处理内存分配失败的模式。
int *pNumber = (int*)malloc(25*sizeof(int)); if(!pNumber) { // Code to deal with memory allocation failure . . . }
释放动态分配的内存
当动态分配内存时,您需要在不再需要时释放内存。
要释放内存,只需写下这条语句:
free(pNumber); pNumber = NULL;
free()
函数具有类型为 void *
的形式参数,你可以传递任何类型的指针作为参数。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(void)
{
unsigned long long *pPrimes = NULL; // Pointer to primes storage area
int total = 5; // Number of primes required
// Allocate sufficient memory to store the number of primes required
pPrimes = (unsigned long long*)malloc(total*sizeof(unsigned long long));
if(!pPrimes){
printf("Not enough memory.\n");
return 1;
}
free(pPrimes); // Release the heap memory . . .
pPrimes = NULL; // . . . and reset the pointer
return 0;
}
上面的代码生成以下结果。
例子
在本节中,我们将使用指针创建一个动态数组。
一般来说,我们可以声明一个数组使用[]和size。 现在我们可以声明动态大小的数组。
基本上,当我们添加一个新值时,我们分配内存,然后将其附加到数组。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char* argv[]) {
// define dynamic array of pointer
int *numbers; // single array pointer
// a number of array
int N = 10;
// allocate memory
numbers = malloc( N * sizeof(int));
// set values
int i;
for(i=0;i<N;i++){
numbers[i] = i+3;
}
// display values
for(i=0;i<N;i++){
printf("%d ",numbers[i]);
}
printf("\n");
// free memory
free(numbers);
return 0;
}
上面的代码生成以下结果。
注意
另一个示例,我们还定义了具有多维的动态数组。
例如,我们创建二维动态数组。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char* argv[]) {
// define dynamic array of pointer
int **matrix; // two dimensional array pointer
// a number of array
int M = 3;
int N = 5;
// allocate memory
matrix = malloc( M * sizeof(int*));
// set values
int i,j;
for(i=0;i<M;i++){
matrix[i] = malloc( N * sizeof(int));
for(j=0;j<N;j++){
matrix[i][j] = i + j;
}
}
// display values
for(i=0;i<M;i++){
for(j=0;j<N;j++){
printf("%d ",matrix[i][j]);
}
printf("\n");
}
// free memory
free(matrix);
return 0;
}
上面的代码生成以下结果。
使用calloc()函数的内存分配
在stdlib.h头中声明的 calloc()
函数。
它提供了比 malloc()
的几个优势。
它将内存分配为给定大小的元素数。
它初始化分配的内存,使所有字节为零。
calloc()函数需要两个参数值:数据项的数量和每个数据项的大小。
两个参数都是 size_t
类型。
分配的区域的地址返回类型void *。
这里是如何使用 calloc()
为int类型的75个元素的数组分配内存:
int *pNumber = (int*) calloc(75, sizeof(int));
如果不可能分配所请求的内存,则返回值将为NULL。
你可以让编译器负责提供转换:
int *pNumber = calloc(75, sizeof(int));
例子
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(void)
{
unsigned long long *pPrimes = NULL; // Pointer to primes storage area
int total = 5; // Number of primes required
// Allocate sufficient memory to store the number of primes required
pPrimes = calloc((size_t)total, sizeof(unsigned long long));
if (pPrimes == NULL) {
printf("Not enough memory. It"s the end I"m afraid.\n");
return 1;
}
free(pPrimes); // Release the heap memory . . .
pPrimes = NULL; // . . . and reset the pointer
return 0;
}
上面的代码生成以下结果。
扩展动态分配的内存
realloc()函数使您能够重用或扩展内存您先前使用malloc()或calloc()(或realloc())分配。
realloc()函数需要两个参数值:一个包含先前地址的指针通过调用malloc(),calloc()或realloc()返回,以及新内存的大小(以字节为单位)。
例3
由malloc()获取的各个内存段可以像数组成员一样处理;这些内存段可以用索引引用。
#include <stdio.h>
#include <stdlib.h>
main()
{
int *numbers;
int x;
numbers = (int *) malloc(5 * sizeof(int));
if ( numbers == NULL )
return; // return if malloc is not successful
numbers[0] = 100;
numbers[1] = 200;
numbers[2] = 300;
numbers[3] = 400;
numbers[4] = 500;
printf("\nIndividual memory segments initialized to:\n");
for ( x = 0; x < 5; x++ )
printf("numbers[%d] = %d\n", x, numbers[x]);
}
上面的代码生成以下结果。
例4
以下代码显示了扩展的连续内存和realloc()的结果。
#include<stdio.h>
#include<stdlib.h>
main()
{
int *number;
int *newNumber;
int x;
number = malloc(sizeof(int) * 5);
if ( number == NULL ) {
printf("\nOut of memory!\n");
return;
} // end if
printf("\nOriginal memory:\n");
for ( x = 0; x < 5; x++ ) {
number[x] = x * 100;
printf("number[%d] = %d\n", x, number[x]);
} // end for loop
newNumber = realloc(number, 10 * sizeof(int));
if ( newNumber == NULL ) {
printf("\nOut of memory!\n");
return;
}
else
number = newNumber;
//intialize new memory only
for ( x = 5; x < 10; x++ )
number[x] = x * 100;
printf("\nExpanded memory:\n");
for ( x = 0; x < 10; x++ )
printf("number[%d] = %d\n", x, number[x]);
//free memory
free(number);
}
上面的代码生成以下结果。