p2p网站开发维护,网站系统 建设和软件岗位职责,健康网站可以做推广吗,python语言基础知识1.为什么要动态内存分配#xff1f; int val 20;
int a[10]{0};上面我们声明并定义了一个大小为4字节的整型变量#xff0c;一个容量为10*4字节的整型数组。 开辟方式:我们在栈上开辟。 开辟空间的方式有两个特点#xff1a; 1. 空间开辟 大小是固定 的。 2. 数组在申明…1.为什么要动态内存分配 int val 20;
int a[10]{0};上面我们声明并定义了一个大小为4字节的整型变量一个容量为10*4字节的整型数组。 开辟方式:我们在栈上开辟。 开辟空间的方式有两个特点 1. 空间开辟 大小是固定 的。 2. 数组在申明的时候 必须指定数组的长度它所需要的内存在编译时分配 。 但是对于空间的需求不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道 那数组的编译时开辟空间的方式就不能满足了。 有的老铁会说数组的话怎么会不够一开始指定数组长度就为100甚至更大不就行了。确实能想到这样说明你的思维方式没问题当你的父母让你煮饭但是你的父母并没有告诉你具体煮多少时最好的办法就是每个人再多加一碗。这就是扩大范围减少容错率。但是明明每个人一碗饭就够了你多煮一碗就会浪费(不能这餐吃完)。 动态分配诞生 2. 动态内存函数 2.1 malloc和free C 语言提供了一个动态内存开辟的函数 void* malloc (size_t size); 2.2C 语言提供了另外一个函数 free 专门是用来做动态内存的释放和回收的 void free (void* ptr); free 函数用来释放动态开辟的内存。 如果参数 ptr 指向的空间不是动态开辟的那 free 函数的行为是未定义的。 如果参数 ptr 是 NULL 指针则函数什么事都不做。 3.malloc和free #includestdio.h
#includestdlib.h
int main()
{int a[10] {0};int* ptr (int*)malloc( 10* sizeof(int));if (NULL ! ptr)//判断ptr指针是否为空{int i 0;for (i 0; i 10; i){*(ptr i) i;printf(%3d,i);}}free(ptr);//释放ptr所指向的动态内存ptr NULL;return 0;
} malloc和free都声明在 stdlib.h 头文件中。 使用要包含头文件。上面我们让一个指针ptr指向了开辟了10个整型大小空间。并赋值。然后释放。 我们可以按F11开始调试具体可以看看作者这篇文章。 最后运行完free,空间就会释放出来。 如果没有free函数当程序结束后同样空间也会释放但是就像你借书一样你又不看别人想用又用不了这样的事其实就很没意义了。好习惯是有借有还。我们在释放完空间后应该把指针置空防止要使用这个指针时这个指针还是指向这块分配的区域导致出错。 4.calloc函数 C语言还提供了一个函数叫 calloc calloc 函数也用来动态内存分配。 void* calloc (size_t num, size_t size); 它与malloc功能一样。但是它在使用的时候会初始化数据为0。 (int*)calloc(10,sizeof(int))int*malloc(10*sizeof(int))初始化数据为0 5.realloc函数 void* realloc (void* ptr, size_t size); realloc 函数的出现让动态内存管理更加灵活。 有时会我们发现过去申请的空间太小了有时候我们又会觉得申请的空间过大了那为了合理的时 候内存我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小 的调整。 ptr 是要调整的内存地址 size 调整之后新大小 返回值为调整之后的内存起始位置。 这个函数调整原内存空间大小的基础上还会将原来内存中的数据移动到 新 的空间。 realloc 在调整内存空间的是存在两种情况 情况 1 原有空间之后有足够大的空间 情况 2 原有空间之后没有足够大的空间 情况 1 当是情况 1 的时候要扩展内存就直接原有内存之后直接追加空间原来空间的数据不发生变化。 情况 2 当是情况 2 的时候原有空间之后没有足够多的空间时扩展的方法是在堆空间上另找一个合适大小 的连续空间来使用。这样函数返回的是一个新的内存地址 由于上述的两种情况 realloc 函数的使用就要注意一些。