返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++使用动态内存分配的原因解说
  • 489
分享到

C++使用动态内存分配的原因解说

2024-04-02 19:04:59 489人浏览 八月长安
摘要

上节我们讲了c++程序的内存分布。C++程序的内存分布 本节来介绍为什么要进行内存分配。 按需分配,根据需要分配内存,不浪费。 内存拷贝函数void* memcpy(void* de

上节我们讲了c++程序的内存分布。C++程序的内存分布
本节来介绍为什么要进行内存分配。

按需分配,根据需要分配内存,不浪费。
内存拷贝函数void* memcpy(void* dest, const void* src, size_t n);
从源src中拷贝n字节的内存到dest中。需要包含头文件#include <string.h>


#include <stdio.h>  
#include <string.h>

using namespace std;

int main() {
    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    int* b;
    b = new int[15];

    //从a拷贝10 * 4字节的内存到b
    memcpy_s(b, sizeof(int) * 10, a, sizeof(int) * 10);

    //进行赋值
    for(int i = sizeof(a) / sizeof(a[0]); i < 15; i++){
        *(b + i) = 15;
    }
    
    for (int i = 0; i < 15; i++) {
        printf("%d ", b[i]);
    }


    return 0;
}

输出结果:

1 2 3 4 5 6 7 8 9 10 15 15 15 15 15

在这里插入图片描述

被调用函数之外需要使用被调用函数内部的指针对应的地址空间


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

using namespace std;

//定义一个指针函数
void* test() {
    void* a;
    //分配100*4个字节给a指针
    //mallocC语言的动态分配函数
    a = malloc(sizeof(int) * 100);
    if (!a) {
        printf("内存分配失败!");
        return NULL;
    }

    for (int i = 0; i < 100; i++)
    {
        *((int*)a + i) = i;
    }

    return a;
}

int main() {
    //test()返回void*的内存,需要强转换
    int* a = (int*)test();

    //打印前20个
    for (int i = 0; i < 20; i++) {
        printf("%d ", a[i]);
    }

    //C语言的释放内存方法
  free(a);

    return 0;
}

输出结果:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

此处在main函数中使用了在test()函数中分配的动态内存重点地址。

也可以通过二级指针来保存,内存空间:


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

using namespace std;

//定义一个指针函数
void test(int **a) {

    *a = (int*)malloc(sizeof(int) * 100);
    if (!*a) {
        printf("内存分配失败!");
        exit(0);
    }

    for (int i = 0; i < 100; i++)
    {
        *(*a + i) = i;
    }
}

int main() {
    //test()返回void*的内存,需要强转换
    int* a;
    test(&a);

    //打印前20个
    for (int i = 0; i < 20; i++) {
        printf("%d ", a[i]);
    }

    free(a);

    return 0;
}

突破栈区的限制,可以给程序分配更多的空间。
栈区的大小有限,在windows系统下,栈区的大小一般为1~2Mb


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

using namespace std;

void test() {
    //分配一个特别大的数组
    int a[102400 * 3];// 100k * 3 * 4 = 1200K
    a[0] = 0;
}

int main() {
    test();

    return 0;
}

点运行会出现Stack overflow的提示(栈区溢出!)。
修改:


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

using namespace std;

void test() {
    //在堆中分配一个特别大的数组1G
    //在Windows 10 系统限制的堆为2G
    int* a = (int*)malloc(1024 * 1000 * 1000 * 1); //1G
    a[0] = 0;
}

int main() {
    test();

    return 0;
}

成功运行!但是当分配两个G的动态内存时,就会报错,这个时候分配失败,a = NULL;

总结:使用堆分三个点。

1、按需分配,根据需要分配内存,不浪费。
2、被调用函数之外需要使用被调用函数内部的指针对应的地址空间。
3、突破栈区的限制,可以给程序分配更多的空间。

本节介绍了为什么使用动态内存分配,下节我们介绍动态内存的分配、使用、释放。

到此这篇关于C++使用动态内存分配的原因解说的文章就介绍到这了,更多相关C++使用动态内存分配内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++使用动态内存分配的原因解说

本文链接: https://lsjlt.com/news/124839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++使用动态内存分配的原因解说
    上节我们讲了C++程序的内存分布。C++程序的内存分布 本节来介绍为什么要进行内存分配。 按需分配,根据需要分配内存,不浪费。 内存拷贝函数void* memcpy(void* de...
    99+
    2024-04-02
  • C语言的动态内存分配及动态内存分配函数详解
    目录mallocmalloc的使用:freecalloccalloc的使用:reallocrealloc的使用改进:realloc的另一种用法:常见的动态内存错误对空指针的解引用操作...
    99+
    2024-04-02
  • 带你了解C++的动态内存分配
    目录new与delete运算符动态分配数组动态分配字符串总结new与delete运算符 数组在定义时就规定了其长度,这使得它的内存空间也固定了下来,这称为静态内存分配。 内存申请大了...
    99+
    2024-04-02
  • 详解C语言动态内存的分配
    目录C 程序中,不同数据在内存中分配说明内存动态分配的相关函数应用实例动态分配内存的基本原则总结C 程序中,不同数据在内存中分配说明 1)全局变量——内存中的...
    99+
    2024-04-02
  • C语言动态内存分配怎么使用
    这篇文章主要介绍了C语言动态内存分配怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存分配怎么使用文章都会有所收获,下面我们一起来看看吧。一、动态内存分配的意义C语言中的一切操作都是基于内存的...
    99+
    2023-06-30
  • C++动态内存管理详情解说
    目录写在前面C/C++ 内存分布C语言内存管理方式C++内存管理方式C++为何增加了new 和 deletenew 一个对象new 一个数组deletemalloc &am...
    99+
    2024-04-02
  • C++继承和动态内存分配
    目录1.简介2.派生类不用new3.派生类使用new文章转自微信 公众号:Coder梁(ID:Coder_LT) 1.简介 这里面有一个问题,当我们的基类使用动态内存分配,并且重新定...
    99+
    2024-04-02
  • C语言深入讲解动态内存分配函数的使用
    目录一、malloc二、free(用于释放动态开辟的空间)三、calloc四、realloc五、常见的动态内存分配错误六、柔性数组局部变量和函数的形参向栈区申请空间 全局变量和sta...
    99+
    2024-04-02
  • C语言动态内存的分配实例详解
    目录前言动态内存分配的定义动态内存的优势<1>  可以控制内存的大小<2> 可以多次利用这部分空间<3>不占用栈区的内存malloc c...
    99+
    2024-04-02
  • C语言深入探索动态内存分配的使用
    目录一、动态内存分配的意义二、malloc 和 free三、关于 malloc(0)四、calloc 和 realloc五、小结一、动态内存分配的意义 C语言中的一切操作都是基于内存...
    99+
    2024-04-02
  • C语言动态内存分配图文讲解
    目录思维导图1.为什么存在动态内存分配2.动态内存函数的介绍2.1 malloc2.2 free2.3 calloc2.4 realloc3.常见的动态内存错误思维导图 1.为什么...
    99+
    2023-01-17
    C语言动态内存分配 C语言动态内存分配函数
  • C语言动态内存分配函数如何使用
    这篇文章主要介绍“C语言动态内存分配函数如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言动态内存分配函数如何使用”文章能帮助大家解决问题。局部变量和函数的形参向栈区申请空间全局变量和st...
    99+
    2023-06-30
  • C语言的动态内存如何分配
    今天小编给大家分享一下C语言的动态内存如何分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。动态内存分配的定义首先我们要搞清...
    99+
    2023-07-02
  • 怎么在C++中动态内存分配
    今天就跟大家聊聊有关怎么在C++中动态内存分配,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。按需分配,根据需要分配内存,不浪费。内存拷贝函数void* memcpy(void* de...
    99+
    2023-06-14
  • 如何在c++中分配动态内存
    今天就跟大家聊聊有关如何在c++中分配动态内存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。动态申请内存操作符 newnew 类型名T(初始化参数列表)功能:在程...
    99+
    2023-06-06
  • C语言中关于动态内存分配的详解
    目录一、malloc 与free函数二、calloc三、realloc四、常见的动态内存的错误【C语言】动态内存分配 本期,我们将讲解malloc、calloc、realloc以及f...
    99+
    2024-04-02
  • 深入了解C语言中的动态内存分配
    目录什么是动态内存分配如何进行动态内存分配首先我要介绍两个函数 malloc 和 free第二个开辟空间的动态内存分配的函数 calloc大小修改函数realloc今天我们来学习一下...
    99+
    2024-04-02
  • C++ 动态内存分配详解(new/new[]和delete/delete[])
    一、为什么需要动态内存分配? 在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。 但是可能存在程序的内存需求只能在运行时确定的情况。 例如,当需要的内存取决于...
    99+
    2024-04-02
  • C语言编程C++动态内存分配示例讲解
    目录动态内存管理为什么存在动态内存分配动态内存函数的介绍malloc申请空间和free释放空间有借有还 free释放内存calloc申请内存realloc调整动态内存的大小reall...
    99+
    2024-04-02
  • AndroidNDK开发(C语言--动态内存分配)
    1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作