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