动态内存开辟
void* malloc (size_t size); // 函数原型
void free (void* ptr);
如果开辟成功,则返回void* 类型的指针
如果开辟失败,则返回空指针
free只能释放堆区开辟的空间
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 使用malloc开辟10个整形的空间
int* p = (int*)malloc(10 * sizeof(int)); // 由于malloc的返回值是void*,所以一般要强转
// 如果开辟失败
if (p == NULL)
{
perror("erro");
}
else {
// 赋值
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
// 打印
for (i = 0; i < 10; i++)
printf("%d ", i);
}
// 使用完该空间之后要用free函数将该空间释放,free函数需要传递一个指向该空间的指针
free(p);
// 接着需要将指针p置为NULL,防止它访问已经释放的空间
p = NULL;
return 0;
}
void* calloc (size_t num, size_t size);
calloc会将开辟的内存的所有字节初始化为0
int main()
{
int* p = (int*)calloc(10, sizeof(int)); // 开辟十个int类型的空间
if (p == NULL)
perror("erro");
for (int i = 0; i < 10; i++)
{
printf("%d\n", *(p + i));
}
free(p);
p == NULL;
return 0;
} // 运行结果为全0
realloc请求的大小可以比当前分配的字节数小或者大。如果比当前分配的小,那么多余的内存会返回给堆,不能保证多余的内存会被清空。
如果比当前分配的大,那么可能的话,就在紧挨这当前分配内存的区域分配新的内存(内存足够),否则就会在堆的其它区域分配并把旧的内存复制到新区域
void* realloc (void* ptr, size_t size);
int main()
{
int* p = (int*)calloc(10, sizeof(int)); // 开辟十个int类型的空间
if (p == NULL)
perror("erro");
for (int i = 0; i < 10; i++)
{
*(p + i) = 1;
}
// 现在需重新开辟20个int类型的空间,就需要用到realloc
int* ptmp = realloc(p, 2000*(sizeof(int)));
if (ptmp != NULL)
p = ptmp;
return 0;
free(p);
}