Html5手机静态网站设计,小程序制作教程视频,哪些平台可以建立网站吗,网站设计风格说明1、malloc函数详解
#xff08;1#xff09;函数声明
#include stdlib.h
void* malloc(size_t size);malloc可以申请一定数量的空闲内存#xff0c;这样的内存是匿名的#xff0c;也就是malloc不会为其赋名#xff0c;但是确实返回动态分配内存块的首元素地址1函数声明
#include stdlib.h
void* malloc(size_t size);malloc可以申请一定数量的空闲内存这样的内存是匿名的也就是malloc不会为其赋名但是确实返回动态分配内存块的首元素地址因此可以把该地址赋给一个指针变量利用这个指针访问这块内存malloc通常返回一个char类型的指针因为char表示一个字节。然而从ANSI C标准开始C使用一个新的类型void*即一个指向void的指针相当于一个“通用指针”由此malloc可以返回多个类型的指针。所以通常malloc的返回值都会强制转化为匹配的类型把指向void的指针赋给任意类型的指针完全不需要考虑类型匹配的问题如果malloc分配内存失败就会返回空指针
2使用函数
①使用malloc创建一个数组
double* ptd;
ptd (double*)malloc(30 * sizeof(double));
if(ptd NULL)//有可能不会分配到内存
{printf(Nunber not correctly entered -- bye);exit(EXIT_FAILURE);//程序异常终止程序
}
//某些使用ptd的程序
free(ptd);//用完后释放申请的空间将内存还给计算机
ptd NULL;//并且将还记住地址ptd指针置空②使用注意事项
如果让ptd指向这块内存的首元素便可以使用数组名一样使用它也就是说可以使用ptd[0]、ptd[1]等指针用法ptd指向的是一个double类型的指针而不是整个30个double类型的块在C中不一定使用强制转化类型但是在C中必须使用在C中使用强制类型转换更加容易把C程序转化为C最后两步是为了避免内存泄露的问题后面会提到
③三种创建数组的方式
声明数组直接用常量表达式表达数组的维度用数组名访问数组的元素可以用静态内存或自动内存创建这种数组声明变长数组C99新增特性用变量表达式表达数组的维度具有这种特性的数组只能在自动内存中存储声明一个指针调用malloc函数将其返回值赋给指针使用这个指针访问数组的元素该指针可以是静态的或自动的
2、free函数详解
1函数声明
#include stdlib.h
void free(void *ptr);free通常都会搭配malloc使用free的参数是之前mlloc返回的地址该函数释放之前malloc分配的一块内存。不能使用free释放其他方式例如声明一个数组后使用free这样配套使用的话malloc分配内存free释放内存可以重复利用一块内存空间内存池
2使用函数
double* ptd;
ptd (double*)malloc(30 * sizeof(double));
free(ptd);
ptd NULL;3、exit函数详解
1函数声明
#include stdlib.h
void exit(int status);如果malloc函数分配内存失败可以调用函数exit结束程序status是返回给父进程的状态值。标准提供了两个返回值被定义在stdlib.h中保证在所有的操作系统中都能正常工作一些操作系统还会接受一些表示其他运行错误的整数值 EXIT_FAILURE表示程序异常终止EXIT_SUCCESS相当于0表示普通的程序结束
2使用函数
int sum 0;
if(scanf(%d, sum) ! 1)
{printf(Nunber not correctly entered -- bye);exit(EXIT_FAILURE);
}4、内存泄露的危害
void function(int n)
{double* temp (double*)malloc(n * sizeof(double));/*假设忘记使用函数free()*/
}
int main()
{for(inţ i 0; i 1000000)function(1000000);
}如果没有使用free函数将malloc申请的内存释放的话1000000*1000000就有可能将所有内存耗尽这类问题就被称为内存泄露在函数末尾调用free函数可以避免这类问题。
5、动态内存分配和变长数组的区别
动态内存分配malloc和变长数组VLA在功能上有点重合比如两者都可以用于创建在运行时才确定大小的数组不同的是变长数组是自动存储类型。因此程序在离开变长数组定义的块的时候变长数组占有的空间会被自动释放不必使用free函数另外一方面free所用的指针变量可以与malloc函数的指针变量不同但是两个指针必须存储相同的地址并且不能释放两次对多维数组来说使用VLA在语法上更加的方便使用malloc就会显得复杂得多
int n 5, m 6;int ar2[n][m];//变长数组要求支持VLAint (* p2)[6];//指向一个6元素数组的指针使用变量p2存储
int (* p3)[m];//指向一个m元素数组的指针使用变量p3存储要求支持VLA
p2 (int (*)[6])malloc(n * 6 * sizeof(int));//n*6数组
p3 (int (*)[m])malloc(n * m * sizeof(int));//n*m数组要求支持VLA6、存储类别和动态内存分配
1简单分类内存
可以简单认为程序把它可用的内存分为3部分
供给具有外部链接、内部链接和无连接的静态变量使用供给自动变量使用供给动态内存分配使用内存堆/堆/自由内存
2三类内存的细节
静态存储类别的变量使用的内存数量在编译的时候就确定只要程序还在运行就可以访问存储在该部分的数据。该类别的变量在程序开始执行时就被创建在程序结束的时候被销毁自动存储类别的变量在程序进入变量定义的块时存在程序离开块的时候消失。因此随着程序调用函数和函数结束自动变量所用的内存数量也在相应的增加或减少。这部分的内存通常作为栈来处理这意味着新创建的变量按顺序加入内存然后以相反的顺序销毁动态分配的内存在调用malloc函数或相关函数的时候存在在调用free函数后释放这一部分的内容由程序员管理而不是某套规则。另外未使用的内存块分散在已使用的内存块之间使用动态内存通常比使用栈内存慢