c/c++动态分配内存和malloc的使用

c/c++动态分配内存 

为什么需要动态分配内存

---很好的解决的了传统数组的4个缺陷

动态内存分配举例

---动态数组的构造

使用动态数组的优点:   
1. 动态数组长度不需要事先给定;
2. 内存空间可以手动释放;
3. 在程序运行中, 动态内存空间大小可以通过realloc函数手动扩充或缩小

 静态内存和动态内存的比较  

静态内存是由系统自动分配,有系统自动释放

静态内存是在栈分配的

动态内存是由程序员手动分配,手动释放,动态内存是在堆分配的

动态内存和静态内存的比较

静态内存是由系统自动分配,由系统自动释放
静态内存是在栈分配的

动态内存是由程序员手动分配,手动释放
动态内存是在堆分配的

难点

/*
    2009年11月17日10:21:31
    malloc 是 memory(内存) allocate(分配)的缩写

*/
# include <stdio.h>
# include <malloc.h>  //不能省

int main(void)
{
    int i = 5; //分配了4个字节 静态分配   11 行
    int * p = (int *)malloc(4); //12行
        /*
            1. 要使用malloc函数,必须添加malloc.h这个头文件
            2. malloc函数只有一个形参,并且形参是整型
            3. 4表示请求系统为本程序分配4个字节
            4. malloc函数只能返回第一个字节的地址
            5. 12行分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节
            6. p本身所占的内存是静态分配的, p所指向的内存是动态分配的
        */

    *p = 5; //*p 代表的就是一个int变量, 只不过*p这个整型变量的内存分配方式和11行的i变量的分配方式不同
    free(p); //freep(p)表示把p所指向的内存给释放掉  p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时由系统自动释放
    printf("同志们好!\n");

    return 0;
}
malloc的用法:demo1 .
# include <stdio.h>
# include <malloc.h>

void f(int * q)
{
    //*p = 200; //error
    //q = 200;
    //**q = 200;  //error
    *q = 200;
    //free(q);  //把q所指向的内存释放掉  本语句必须的注释掉,否则会导致第20行的代码出错
}

int main(void)
{
    int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数
    *p = 10;

    printf("%d\n", *p);  //10
    f(p);  //p是int *类型
    printf("%d\n", *p);  //200    第20行

    return 0;
}

demo2.

# include <stdio.h>
# include <malloc.h>

int main(void)
{
//    int k;
    int * p = (int *)malloc(4);
        /*
            malloc函数的返回值是void *
            void * 也叫干地址  所谓干地址就是无实际意义的地址
        */

    free(p); //把p指向的内存释放

    return 0;
}
动态一维数组示例:
# include <stdio.h>
# include <malloc.h>

int main(void)
{
    int a[5]; //如果int占4个字节的话,则本数组总共包含有20个字节,每四个字节被当做了一个int变量来使用
    int len;
    int * pArr;
    int i;

    //动态的构造一维数组
    printf("请输入你要存放的元素的个数: ");
    scanf("%d", &len);
    pArr = (int *)malloc(4 * len);  //第12行  本行动态的构造了一个一维数组, 该一维数组的产度是len, 该数组的数组名是pArr, 该数组的每个元素是int类型  类似于 int pArr[len];

    //对一维数组进行操作,  如:对动态一维数组进行赋值
    for (i=0; i<len; ++i)
        scanf("%d", &pArr[i]);

    //对位一维数组进行输出
    printf("一维数组的内容是:\n");
    for (i=0; i<len; ++i)
        printf("%d\n", pArr[i]);

    free(pArr); //释放掉动态分配的数组

    return 0;
}

示意图:



c/c++动态分配内存和malloc的使用

时间: 2024-11-16 20:46:51

c/c++动态分配内存和malloc的使用的相关文章

动态分配内存函数:malloc(),calloc(),realloc(),以及memset(),free() 详细总结

以下资料大部分来源网络,个人进行了汇总和添加. 内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的,变量生命长度:函数结束即释放内存. 堆区(heap):一般由程序员分配与释放,即程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿

Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏

内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了 原文地址:https://www.cnblogs.com/focusonoutput/p/12446042.html

11、动态分配内存malloc/free

动态分配内存 内存的申请和释放使用两个函数来实现: malloc/free. malloc申请内存 #include<stdlib.h> int main() { int* p = (int*)malloc(100 * 4);// 申请100*4字节 for(int i = 0;i <100;i++){ p[i] = i * i; // 使用这块内存 } return 0; } 需要注意的是,要申请空间的大小以字节为单位,应用程序自己负责计算一共需要多少字节.比如要存储100个int,那

C中动态分配内存

//使用动态分配内存时,要包含头文件<stdlib.h> //malloc的参数为要分配的内存的字节数 //其返回所分配内存的第一个字节的地址 //返回类型是void*,但实际中常常转换为具体类型便于使用 //如果因某种原因而不能分配将返回NULL指针,所以使用时应验证是否分配成功 int *pNumber1=(int *)malloc(100*sizeof(int)); //calloc把内存分配为给定大小的数组,并初始化分配的内存为0 //calloc需要两个参数,1为数组元素个数,2为数

动态分配内存专题

我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??既然有人会问这样的问题,那么我在这里好好的讲解一下吧!首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数):2)字符常量区:主要是储存一些字符常量,比如:char *p_str="cgat";其中"cgat"就储存在字符常量区里面:3)全局区:在全

标C编程笔记day06 动态分配内存、函数指针、可变长度參数

动态分配内存:头文件 stdlib.h malloc:分配内存 calloc:分配内存,并清零 realloc:调整已分配的内存块大小 演示样例: int *p=(int *) malloc(3*sizeof(int));//分配内存,成功返回首地址,失败返回NULL free(p);p=NULL;//释放分配的内存,并改动指针的值,避免出现野指针(指向一个地址,但地址已被回收) const 与指针: const int *p; //指针可变,指针相应的数据不可改动 int * const p;

动态分配内存

1.自动分配内存:当定义一个基本类型的变量的时候,系统会为这个变量自动分配内存,这个内存在堆上.当作用域结束,系统        会自动讲这个内存回收. 动态分配内存:开发人员自己向系统申请的内存空间,申请的内存位于栈上,当作用域结束之后,系统是不会自动回收内存  的,这个内存必须由开发人员自己去释放,如果不释放,就内存泄露了. 2.什么时候需要动态分配内存 程序运行过程中,需要保存/记录相应的数据,但是有没有提前准备好内存,那么就需要临时动态分配内存. 3.使用的函数 void  *mallo

动态分配内存的初始化

9 下面哪种C/C++分配内存的方法会将分配的空间初始化为0 malloc() calloc() realloc() new[ ] 答案:B: 1) malloc 函数: void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化. 2)calloc 函数: void *calloc(unsigned int num, unsigned int si

比较C/C++和Delphi中的字符串和字符数组(数组和动态分配内存的情况)

本文所讲解的只是从其中一个方面来看待进行的总结,所以有必要结合<Delphi字符串与字符数组之间的转换(初始化的重要性)>等文章进行更全面的了解,会从更多方面来理解字符串.内存.类型转换 C/C++中的字符串.字符数组.字符指针分配的内存空间 我们知道在C/C++中,我们可以这样理解字符串和字符数组 1)字符串,就是一个以 '\0' 结尾的字符数组 2)字符数组,包括字符串,但是不一定要以 '\0' 结尾,如果不是以'\0' 结尾,那么就不能当做字符串使用 在C/C++中,使用字符串可以通过数