
第一章是编程的基础. 本文介绍了1.9.1 malloc()函数和1.9.2 calloc()函数.
>>>> 1.9动态分配内存
首先查看内存分配. 所有程序必须保留足够的内存来存储程序使用的数据. 其中一些内存会自动分配. 例如calloc函数使用,声明“ int iNum;”为int类型的值保留足够的内存,或者显式分配一定数量的内存“ int pData [20]”;声明保留20个存储单元,每个存储单元存储int类型的值. 该声明还提供了内存的标识符,因此可以使用iNum或pData来标识数据. 程序加载到内存时分配静态数据,程序执行时分配自动数据,程序退出时销毁. 但是C所能做的远不止于此. 您可以在程序运行时请求所需的内存量.
程序在运行时分配的内存空间称为“堆”存储池. 尽管计算机不直接在硬件上支持堆,但是C函数库(stdlib.h)分别提供了动态内存分配和释放. 函数malloc()和free(),即在运行时根据需要创建存储单元,并在不需要时释放它.
>>> 1.9.1malloc()函数
malloc()函数的原型如下:
void * malloc(无符号整数大小);

其中,void *表示该函数是一个指针函数,size是所需的内存字节数,可以使用sizeof运算符计算每个元素所需的空间量和内存字节数所有元素都需要. 如果分配成功,尽管malloc()不会为分配的内存分配名称,但它会返回动态分配的内存块的第一个字节的地址. 因此,您可以将地址分配给指针变量,然后使用指针变量访问该内存. 如果分配不成功或内存不足,则返回空指针NULL. 因此,在使用指针返回之前,请务必检查返回值,否则可能导致程序异常终止. 例如:
int * pi = malloc(sizeof(int));
如果(pi!= NULL){
//指针没有问题
}其他{
//无效的指针
}

The
malloc()函数可用于返回指向数组的指针,指向结构的指针等,因此通常此函数的返回值将被强制转换为匹配类型,但从C99版本开始,不需要类型为void *的指针. 通过强制将其分配给所有指针类型变量.
编写程序时,通常很难估计数组的适当大小. 等待程序运行以确定阵列的实际大小会更方便. 该方法是在程序执行期间使用malloc()为数组分配空间,然后通过指向数组第一个元素的指针访问数组. 假设您正在编写的程序需要一个由n个整数组成的数组,其中n可以在程序执行期间进行计算. 首先,您需要声明指针变量:
int * pi,n;
一旦知道n的值,就让程序调用malloc()函数为数组分配存储空间:
pi = malloc(n * sizeof(int));
如果(pi == NULL)返回-1;

当pi指向动态分配的内存块时,您可以忽略pi是指针的事实,并将其用作数组名称. 这是C数组与指针之间紧密关系所带来的便利. 由于数组名称是数组第一个元素的地址,因此,如果让pi指向该块的第一个元素,则可以像使用数组名称一样使用它. 也就是说,您可以使用pi [0]访问块的第一个元素,使用pi [1]访问第二个元素,依此类推. 例如,使用以下循环初始化pi指向的数组:
for(i = 0; i 动态内存分配可以提供更大的灵活性calloc函数使用,例如: char * pcStr; char * pcStr = malloc(strlen(“确定!”)+ 1); strcpy(pcStr,“确定!”); 在这里,使用strlen()计算字符串的长度,请务必记住要添加结束字符NUL. 为什么不使用sizeof?因为szieof将返回数组和指针的长度,而不是字符串的长度. >>> 1.9.2 calloc()函数 尽管可以使用malloc()函数为数组分配内存,但是C语言提供了更好的calloc()函数,该函数的原型如下: void * calloc(size_t nmenb,size_t大小); calloc()函数为nmemb元素数组分配内存空间,其中每个元素的长度为大小字节. 如果请求的空间无效,则此函数返回一个指针. 分配内存后,calloc()函数将通过将所有位设置为0进行初始化. 例如,调用calloc()函数为n个整数的数组分配存储空间,并确保将所有整数初始化为0. 例如: pi = calloc(n,sizeof(int)); 由于calloc()函数将清楚地分配内存,而malloc()函数不会,因此可以使用以“ 1”作为第一个参数的calloc()函数来为任何类型的数据项分配空间. 例如: 结构点{int x,y;} * pi; pi = calloc(1,sizeof(结构点)); 执行此语句后,pi将指向一个结构,并且该结构的成员x和y将被设置为0. 扩展阅读 返回搜狐了解更多
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-176331-1.html
就是这个道理
我们可以打一场快速的局部战争