使用malloc和free函数进行内存动态分配

一、在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来进行分析

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 int main(void)
 4 {
 5     int a[5] = {4, 10, 2, 8, 6};
 6     int len;
 7     printf("请输入数组的长度大小:len= ");
 8     scanf("%d",&len);
 9     int * pArr = (int *)malloc(sizeof(int) * len);
10     *pArr =4;
11     pArr[1] =10;a
12     printf("%d %d\n", *pArr, pArr[1]);
13     free(pArr);
14
15     return 0;
16 }

程序代码说明:

1、(int *)malloc(sizeof(int) * len)这句话的意思是:

a、这里使用了函数sizeof返回数据类型为int 的数组字节个数,同时这里要注意我们这里写的malloc函数只有一个形参,表示要求系统分配的字节数

b、malloc函数的功能是请求系统sizeof(int) * len个字节的内存空间,如果请求分配成功的话,则返回第一个字节的地址,如果分配不成功的话,则返回NULL。

c、malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无实际意义的第一个字节的地址(俗称干地址)转化为有实际意义的地址,所以malloc函数前面必须加(数据类型  *),表示把这个无实际意义的地址转为相应数据类型的地址。

d、所以这里这句话的意思是把系统分配好的20个字节的第一个字节的地址转为四个字节,这样p就指向了第一个的四个字节,pArr+1就指向了第2个的四个字节,pArr+i就指向了第i+1个的四个字节。pArr[0]就是第一个元素,pArr[i]就是i+1个元素

2、通过上面的分析,上面的代码*pArr=4(也可以写成a[0]=4),pArr[1]=10(也可以写成a[1]=10),同时在分配了20个字节的系统内存后,使用了free()函数进行了释放内存,这样就不会造成系统内存的浪费

3、最终结果为:

二、接下来我使用for循环来访问数组,代码如下:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 int main(void)
 4 {
 5     int a[5] = {4, 10, 2, 8, 6};
 6     int len;
 7     int i=0;
 8     printf("请输入数组的大小:len= ");
 9     scanf("%d",&len);
10     int * pArr = (int *)malloc(sizeof(int) * len);
11     for( i=0; i<len;++i)
12     {
13         scanf("%d",&pArr[i]);
14     }
15     for(i=0;i<len;++i)
16     {
17         printf("%d\n",*(pArr+i));
18     }
19     free(pArr);
20
21     return 0;
22 }

运行结果如下:

三、跨函数使用内存例子:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 struct student
 4 {
 5     int sid;
 6     int age;
 7 };
 8 struct student * creatstudent(void);
 9 void showstudent(struct student *);
10 int main(void)
11 {
12     struct student  *ps ;
13     ps=creatstudent();
14     showstudent(ps);
15
16     free(ps);
17     return 0;
18 }
19 void showstudent(struct student *pst)
20 {
21     printf("%d %d\n",pst->sid, pst->age);
22 }
23 struct student * creatstudent(void)
24 {
25     struct student * p =(struct student *)malloc(sizeof(struct student));
26     p->sid=99;
27     p->age=21;
28     return p;
29 }

运行效果如下:

程序说明:

这里我们通过建立函数来分配内存单元,来达到内存灵活分配使用。

原文地址:https://www.cnblogs.com/1121518wo/p/10887653.html

时间: 2024-08-04 14:36:47

使用malloc和free函数进行内存动态分配的相关文章

malloc函数分配内存失败的常见原因

malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存就会失败,返回空指针NULL(0). malloc中做了哪些事情: 简单的说就是系统中有一个位置标记,标记了 当前已经用掉的内存用到了什么位置,系统中还有一个链表把各个未用的内存块连接起来,申请新内存的时候就未分配的链表中依次查找一个够用的内存块,把这次分配的内存地址返回给用户,把这次用掉的进行映射

内存动态分配与释放

内存的动态分配需要使用函数malloc,函数free和运算符sizeof来实现.函数malloc的原型是: Void* malloc(unsigned int size); 函数malloc的作用是在内存中分配一个长度为size的连续存储空间.函数的返回值是一个指向分配空间的起始位置的指针.如果分配空间失败,则返回NULL.如果要为类型为struct node的结构体分配一块内存空间.可以使用以下语句来实现: p=(struct node*)malloc(sizeof(struct node))

L2--跨函数使用内存

介绍 #include <stdio.h>#include <malloc.h> int main(void) { int *p; //定义了一个指针变量,但并没有为期附初值:下面两个函数都是为其fu初值的操作 f(&p); //f函数,为指针变量p附了一个准确的值,所以是正确的操作 //g(&p);//g函数,虽然在g函数执行过程中未p附了一个准确的值,但g函数执行结束后指针变量的值,并非是一个准确的值 return 0; } void f(int ** q) {

C语言中malloc()和free()函数的具体作用

本文想就C语言中malloc()和free()函数的具体作用做出一些说明,这些细节大家在使用过程中很有可能会忽略. 在C语言中要动态的释放内存,就必然要用到指针,将动态分配获得的空间地址赋值给指针.C语言中动态分配内存的函数为malloc(), 在用完后,要及时调用free()函数释放.理论上,这样是安全的,但其实这样是不安全的,因为free()函数仅仅是告诉操作系统,这块空间我不用了,操作系统收回空间.而指向这块空间的指针并没有改变,它的值仍然指向这块空间.这样,我就可以继续使用该指针操作内存

[整理]内存动态分配

1.不要直接调用mallocvoid *malloc(unsigned int num_bytes); malloc函数的工作机制malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节).接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上.调用free函数时,它将用户释放

跨函数使用内存空间

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法.动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小.凡是在程序中用到系统提供的动态分配存储空间函,均要求包含头文件<malloc.h>. Malloc 向系统申请分配size字节的存储区.返回分配内存空间的起始地址,若分配失败,则返回0,类型是 void* (或chaar*).ma

malloc与free函数用法

在C里,内存管理是通过专门的函数来实现.另外,为了兼容各种编程语言,操作系统提供的接口通常是 C 语言写成的函数声明 (Windows 本身也由C和汇编语言写成). 1 分配内存 malloc 函数 需要包含头文件: #include <stdlib.h> 函数声明(函数原型) void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型.void* 表示未确定类型的指针.C,C++规定,void* 类型可以强制转

早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)

今天和同事review代码时,发现这样的一段代码: Manager * pManager = new Manager(); if(NULL == pManager) { //记录日志 return false; } 然后,一个同事就说这样写欠妥,应该改为: Manager * pManager = NULL; try { pManager = new Manager(); } catch(std::bad_alloc e) { //... } 我查了一下资料,发现: 1.malloc分配时,如果

C语言中malloc()和free()函数解析

1.malloc()和free()的基本介绍 (1)函数原型及说明 void *malloc(long NumBytes) 该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void *FirstByte) 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由. (2)函数基本用法 1 char *Ptr = NULL; 2 Ptr = (char *)malloc(1