ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

分配内存

2022-08-02 13:31:52  阅读:133  来源: 互联网

标签:malloc double ptd 分配内存 内存 数组 指针


所有程序都要留有足够的内存来运行。这些内存中有的是自动分配的:
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);
    }

 

标签:malloc,double,ptd,分配内存,内存,数组,指针
来源: https://www.cnblogs.com/xingyboy/p/16543408.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有