潍坊网站建设 中公,网站支付接口,湘潭网站建设多少钱 报价表湘潭磐石网络,wordpress心情评论插件首先#xff0c;回顾一下内存分配。所有程序都必须预留足够的内存来存储程序使用的数据。这些内存中有些是自动分配的#xff1a;
float x;
int place[100];
这些声明预留了足够的空间#xff0c;还为内存提供了一个标识符#xff0c;可以使用x或place识别数据。
1、mal…首先回顾一下内存分配。所有程序都必须预留足够的内存来存储程序使用的数据。这些内存中有些是自动分配的
float x;
int place[100];
这些声明预留了足够的空间还为内存提供了一个标识符可以使用x或place识别数据。
1、malloc()和free()
malloc()函数接受一个参数所需的内存字节数。malloc函数会找到合适的空闲内存块分配内存。这样的内存是匿名的malloc()分配内存到那时不会为其赋名。它返回动态内存分配内存块的首字节地址。因此可以把该地址赋给一个指针变量并使用指针访问这块内存。因为char表示1字节malloc()的返回类型通常被定义为指向char的指针。从ANSI C标准开始C使用一个新的类型指向void的指针。该类型相当于一个“通用指针”。malloc()函数可用于返回指向数组的指针、指向结构的指针等所以通常该函数的返回值会被强制转化为匹配的类型。然而把指向void的指针赋给任意类型的指针完全不用考虑类型匹配的问题。如果 malloc分配内存失败将返回空指针。
我们试着用malloc()创建一个数组。除了用malloc在陈鼓型运行时请求一块内存还需要一个指针记录着块内存的位置。例如考虑下面的代码
double * pt;
pt (double *) malloc(30 * sizeof(double));
以上代码为30个double类型的值请求内存空间并设置pt指向该位置。注意指针pt被声明为指向一个double类型而不是指向内涵30个double类型值的块。 回忆一下数组名是该数组首元素的地址。因此如果让pt指向这个块的首元素便可像使用数组名一样使用它。也就是说可以使用表达式pt[0]访问该块的首元素pt[1]访问第2个元素.
现在我们有3种创建数组的方法。
声明数组时用常量表达式表示数组的维度用数组名访问数组的元素。可以用静态内存或自动内存创建这种数组。声明变长数组C99时用变量表达式表设计数组的维度用数组名访问数组的元素。具有这种特性的数组只能在自动内存中创建。声明一个指针调用malloc()将其返回值赋给指针使用指针访问数组的元素。该指针可以是静态的或自动的。 使用第2种和第3种方法可以创建动态数组可以在程序运行时选择数组的大小和分配内存。
通常malloc()要与free()配套使用。free函数的参数是之前 malloc返回的地址应该是一个指针指向由 malloc分配的一块内存。该函数释放之前 malloc分配的内存。动态分配内存的存储期从调用 malloc分配内存到调用 free释放内存为止。malloc和 free的原型都在 stdlib.h 头文件中。
使用 malloc程序可以在运行时才确定数组的大小。调用 exit 函 数 结 束 程 序 其 原 型 在 stdlib.h 中 。EXIT_SUCCESS 表示普通的程序结束EXIT_FAILURE 表示程序异常中止。EXIT_FAILURE也被定义在stdlib.h中。
注意free()函数位于程序的末尾它释放了malloc()函数分配的内存free()函数只释放其参数指向的内存块。
2、calloc()函数
分配内存还可以使用calloc()函数典型的用法如下
long * newmem;
newmem (long *)calloc(100, sizeof(long));
和malloc()类似在 ANSI 之前calloc也指向 char 的指针在 ANSI 之后返回指向 void 的指针。如果要存储不同的类型应用强制类型转换运算符。calloc函数接受两个无符号整数作为参数ANSI 规定是 size_t 类型。第一个参数是所需的存储单元数量第二个参数是存储单元的大小。
calloc()函数还有一个特性它把块中的所有位都设置为0注意在某些硬件系统中不是把所有位都设置为0来表示浮点值0。free()函数也可用于释放calloc()分配的内存。
3、动态内存分配和变长数组
变长数组VLA)和调用malloc()在功能上有些重合。不同的是变长数组是自动存储类型因此程序在离开变长数组定义的所在块时变长数组占用的内存空间会被自动释放不必使用free()。另一方面用malloc()创建的数组不必局限在一个函数内访问。 例如可以这样做被调函数创建一个数组并返回指针供主调函数访问然后主调函数在末尾调用free()释放之前别函数分配的内存。 另外free()所用的指针变量可以与malloc()的指针变量不i同但是两个指针必须存储相同的地址。
4、动态内存分配
一般可以认为程序把它可用的内存分为3部分 一部分供具有外部链接、内部链接和无链接的静态变量使用一部分供自动变量使用一部分供动态内存分配。
动态内存分配在调用malloc()或相关函数时存在在调用free()后释放。这部分内存由程序员管理而不是一套规则。所以内存块可以在一个函数中创建在另一个函数中销毁。
总而言之程序把静态对象、自动对象和动态分配对象存储在不同的区域。