1.栈区空间较少
动态开辟数组
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int n = 0;
scanf_s("%d", &n);
int ar[n];
return 0;//c99标准
}
只可以开辟1024,即1M字节
动态在堆区开辟
2.malloc,calloc,realloc函数申请内存空间
无类型指针可以存放任何地址,要进行强转
malloc申请的所有空间都要释放
分配空间时候有上下越界标志fd
free函数可执行
标志域位0,存储空间未用
标志域位1,存储空间已用
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
int main()
{
int n = 5;
//int* ip = (int*)malloc(4 * 5);
int* ip = (int*)malloc(sizeof(int) * 5);
if (ip == nullptr)exit(EXIT_FAILURE);
for (int i = 0; i < n; ++i)
{
ip[i] = i + 10;
}
for (int i = 0; i < n; ++i)
{
printf("%5d", ip[i]);
}
free(ip);
ip = nullptr;
return 0;
}
对于系统开辟空间大小
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
int main()
{
int* ip = (int*)malloc(sizeof(int));
if (nullptr == ip) exit(EXIT_FAILURE);
*ip = 100;
printf("%d \n", *ip);
free(ip);//空悬指针-失效指针
}
开辟的空间只用free一次,不一定每次都能申请到空间,有可能内存不足,返回空指针
3.释放字节个数如何计算?
(1)上下越界标志(各4字节)
(2)头部信息(约28字节):存放申请字节的个数(记录申请字节个数)向上偏移申请字节个数,malloc函数可以串接申请的函数字节,已用和未用标志malloc(sizeof(int*n)判空(申请所有空间全部释放)地址不可设置+±-;空指针可以直接释放
4.内存泄漏:
(1)未free申请字节
(2)指针丢失,地址丢失
(3)malloc开辟空间后,没有释放内存,程序运行过程中内存耗尽
5.calloc函数
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
void* my_calloc(size_t num, size_t size)
{
void* vp = malloc(num * size);
if (nullptr!= vp)
{
memset(vp, 0, num * size);
}
return vp;
}
int main()
{
int n = 10;
int* ip = (int*)malloc(sizeof(int) * n);
if (nullptr == ip) exit(1);
int* is = (int*)calloc(n, sizeof(int));
int* rs = (int*)my_calloc(n, sizeof(int));
free(ip);
ip = nullptr;
free(is);
is = nullptr;
return 0;
}
6.函数作用及差别
void * memcpy( void * destination, const void * source ,size_t num)
void * memmove( void * destination, const void * source ,size_t num);
7.malloc函数出现错误
(1)
内存泄漏,没有free释放
(2)
malloc申请空间没有判空
(3)
free只能释放malloc,realloc,calloc函数开辟的空间,数组开辟的空间此函数不可以释放
(4)
程序只能free释放一次空间
(5)
malloc函数开辟的空间只能释放全部,不能释放小部分,没有判空
(6)
越界标记被改掉,所以函数会越界
(7)
ip++错误,malloc函数申请的空间为定值,不可随意增删
(8)
内存泄漏,程序奔溃
改法一:C++引用
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
void GetString(char*&p, int n)//加一个引用
{
p = (char*)malloc(sizeof(char) * n);
}
int main()
{
int n = 100;
char* cp = NULL;
GetString(cp, n);
strcpy(cp, "hello tulun");
printf("%s", cp);
printf(cp);
free(cp);
return 0;
}
改法二:加一个返回值
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
char* GetString(char*p, int n)//改返回值类型
{
p = (char*)malloc(sizeof(char) * n);
return p;//加一个返回值
}
int main()
{
int n = 100;
char* cp = NULL;
cp = GetString(cp, n);//加一个返回值
strcpy_s(cp, n, "hello tulun");
printf("%s \n", cp);
printf(cp);
free(cp);
return 0;
}
改法三:二级指针
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<limits.h>
#include<string.h>
#include<stdlib.h>
void GetString(char**p, int n)//二级指针
{
*p = (char*)malloc(sizeof(char) * n);
}
int main()
{
int n = 100;
char* cp = NULL;
GetString(&cp, n);//加一个解引用
strcpy_s(cp, n, "hello tulun");
printf("%s \n", cp);
printf(cp);
free(cp);
return 0;
}
程序运行结果: