malloc
void *malloc(size_t size)
size -- 内存块的大小,以字节为单位。 该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。 如果我们需要解引用指针,那么就必须指定它的类型,之前我们讨论过这个问题。直接强转转换需要的类型就可以。
代码语言:javascript复制#include<stdio.h>
#include<Windows.h>
int main()
{
char*p = (char*)malloc(10 * sizeof(char));
p = "cvpotato";
printf("p = %d %s", p, p);
}
calloc
void *calloc(size_t nitems, size_t size)
nitems -- 要被分配的元素个数。
size -- 元素的大小。 calloc和malloc的区别是calloc会初始化从堆分配内存为0 而malloc不会初始化为0
代码语言:javascript复制#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
int main()
{
int i, n;
int* a;
printf("要输入的元素个数:");
scanf("%d", &n);
a = (int*)calloc(n, sizeof(int));
printf("输入 %d 个数字:n", n);
for (i = 0; i < n; i )
{
scanf("%d", &a[i]);
}
printf("输入的数字为:");
for (i = 0; i < n; i ) {
printf("%d ", a[i]);
}
free(a); // 释放内存
return(0);
}
realloc
如果你想修改已经申请的内存块的大小
void *realloc(void *ptr, size_t size)
ptr -- 要重新分配内存的内存块。如果为NULL则表示重新申请一块内存 与malloc功能一样
size--内存块新的大小,以字节为单位。如果为0,则功能和free一样,释放ptr指向的内存块,并且返回一个空指针
代码语言:javascript复制#include<stdio.h>
#include<Windows.h>
#pragma warning (disable:4996)
int main()
{
int n = 0;
printf("请输入数组的大小n");
scanf("%d", &n);
int* p = (int*)calloc(n ,sizeof(int));
for (size_t i = 0; i < n; i )
{
p[i] = i;
}
int*B = (int*)realloc(p, 2*n*sizeof(int));
printf("p = %d B = %dn", p, B);
for (size_t i = 0; i < 2*n; i )
{
printf("%dn", B[i]);
}
free(p);
}
可以看到p的地址和B的地址一样 由此可以推断B内存在p内存上进行了扩展 如果没有连续内存的话 B会创建一块内存区域 然后把A的内容拷贝过来 (新申请内存大于之前的内存) 如果新申请的内存小于之前申请的内存,realloc会把多出来的内存区域释放掉,realloc(p,0);相当于free(p);