分配内存

2022/8/3 5:23:00

本文主要是介绍分配内存,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

所有程序都要留有足够的内存来运行。这些内存中有的是自动分配的:
float x;
char place [] = "The world!";

  为一个基本数据类型的值和一个字符串预留了足够的内存,或者显式指定分配一定数量的内存:

char place[100];

  除了这些,还可以动态分配内存:主要工具是malloc()函数,该函数接受一个参数:所需的内存字节数。malloc()函数会找到合适的空闲内存块,这样的内存是匿名的,malloc()分配内存,但没有赋名。函数返回一个动态分配内存块的首地址,可用指针访问这块内存。指针的新类型:void指针,相当于一个通用指针。malloc()函数可返回数组、结构的指针等,把void指针赋值给任意类型的指针完全不用考虑匹配的问题。如果malloc()赋值失败,返回空指针。

  


 

  使用malloc()函数创建一个数组:

double * ptd;
ptd = (double *) malloc(30 * sizeof(double);

  以上代码为30个double类型的值请求内存空间,并设置ptd指向该位置。ptd指向的是一个double类型。而不是内含30个double的块。回忆一下,数组名是该数组首元素的地址。如果让ptd指向这个块的首元素,便可像数组名那样使用它。使用表达式ptd[0]访问该块的首元素。ptd[1]第二个元素。。。

  现在我们有三种创建数组的方法:

  • 声明数组时,用常量表达式表示数组的维度,用数组名访问数组元素。可以用静态、自动内存创建。
  • 声明变长数组时,用变量表达式表示数组的维度,用数组名访问元素。只能用自动内存创建。
  • 声明一个指针,调用malloc(),将其返回值赋值给指针,使用指针访问数组元素。可以是静态或自动的。

  变长数组和malloc()函数可以创建动态数组。可以在程序运行时选择数组的大小和内存分配。例如,n是一个整数变量。在C99之前,不能这样做:

int arr[n];

  但是可以这样:

int ptd = (int *)malloc(n * sizeof(int));

 


 

 

  通常malloc()函数要与free()配套使用。free()的参数是malloc()函数的返回值。该函数用于释放malloc()分配的内存。因此,动态分配内存的存储期从调用malloc()分配内存到调用free()释放内存为止。设想malloc()和free()管理这同一个地址池,每次malloc()把内存分配给程序使用,free()把内存归还内存池中。不能用free()释放通过其他方式分配的内存。malloc()和free()的函数原型都在stdlib.h中。

  使用malloc()分配内存,程序可以在运行时才确定数组大小。如果内存分配失败,可以调用exit()函数结束程序,其原型在stdlib.h。标准定义了两个返回值保证正常运行:EXIT_SUCCESS,表示普通的程序结束;EXIT_FAILURE,表示程序异常终止。例子如下:

#include<stdio.h> 
#include<stdlib.h> 

int main(){
    double * ptd;
    int max, number;
    int i = 0;
    
    puts("选择数组长度:");
    if(scanf("%d", &max) != 1){
        puts("长度设置失败");
        exit(EXIT_FAILURE); 
    }
    
    ptd = (double *)malloc(max * sizeof(double));
    if(ptd == NULL){
        puts("数组创建失败");
        exit(EXIT_FAILURE);
    }
    
    puts("输入元素:");
    while(i < max && scanf("%lf", &ptd[i]) == 1){
        ++i;
    }
    printf("数组中有%d个元素\n", number = i);
    for(i = 0; i < number; i++){
        printf("%7.2f", ptd[i]);
        if(i % 7 == 6){
            putchar('\n');
        }
    }
    
    if(i % 7 != 0){
            putchar('\n');
    }
    
    puts("完成");
    free(ptd); 
    return 0;
}

 


calloc()函数

  和malloc()类似,返回指向void的指针。如果存储不同的类型,应使用强制类型转换运算符。calloc()接受两个无符号整数作为参数:第一个参数是存储单元个数,第二个参数是存储单元的大小。用calloc()分配的内存默认值为0(malloc()为无意义的值)。free()也可用于释放calloc()分配的内存。

ptd = (double *)calloc(max , sizeof(double));
    if(ptd == NULL){
        puts("数组创建失败");
        exit(EXIT_FAILURE);
    }

 



这篇关于分配内存的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程