内核技术中文网»首页 论坛 圈点 查看内容

0 评论

0 收藏

分享

malloc函数

本帖最后由 极致Linux内核 于 2023-2-4 20:10 编辑

malloc函数动态分配数组,free释放内存

//动态数组 
#include<stdio.h>
#include<stdlib.h>  //为malloc()和free函数提供原型
int main(void){
    double * ptd;
    int max;
    int number;
    int i=0;
    puts("What is the maximum number of type double entries?");
    scanf("%d",&max);
    ptd = (double *)malloc(max * sizeof(double));
    if(ptd==NULL){
        puts("Memory allocation failed. Goodbye.");
        exit(EXIT_FAILURE);
    }
    //ptd 现在指向有max个元素的数组
    puts("Enter the vales(q to quit):");
    while(i< max &&scanf("%lf",&ptd[i])==1)
        i++;
    printf("Here are your %d entries:\n",number=i);//这个时候i=max  输出的%d是number,number=i=max 
    for(i=0;i<number;i++){
        printf("%7.2f",ptd[i]);
        if(i%7==6)          //7个一换行。i从0开始, i%7=6时,已经输出了7个 
        printf("\n"); 
    }
        if(i%7!=0)          //与上面的对应,如果正好就不用再换行,不正好就再换一次。 
            putchar('\n');
            puts("Done.");
            free(ptd);
    return 0; 
} 

上面的代码是用malloc函数动态分配了一个double型数组也可以将其分配给一个int型数组。 而 malloc 则必须由我们计算要字节数,而且在返回后强行转换为实际类型的指针。

int* p;

p = (int *) malloc (sizeof(int));

第一、malloc 函数返回的是 void 类型,假设你写成:p = malloc (sizeof (int)); 则程序无法通过编译,报错:“不能将 void 赋值给 int 类型变量”。所以必须通过 (int ) 来将强制转换。

第二、函数的实參为 sizeof (int) ,用于指明一个整型数据须要的大小。假设你写成:

int p = (int ) malloc (1);

代码也能通过编译,但其实仅仅分配了 1 个字节大小的内存空间,当你往里头存入一个整数,就会有 3 个字节无家可归,而直接 “住进邻居家”!造成的结果是后面的内存中原有数据内容所有被清空。 关于上面代码一些解释:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

需要把指针类型修改为int,malloc函数这样写:ptd = (int )malloc(max sizeof(int));输出的也要更改为%d

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

free()函数的重要性

malloc函数在动态分配数组空间时,只会增大空间,不会减小空间,所以说如果不释放内存,可能会造成内存溢出。因为如果地址没了,内存被占了但是还无法调用,就很难受 eg

在这里插入图片描述

原文作者:刘某某.

原文地址:http://t.csdn.cn/Z0iMg(版权归原文作者所有,侵权联系删除

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
主题 1545
回复 0
粉丝 2
扫码获取每晚技术直播链接
快速回复 返回顶部 返回列表