返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >AndroidNDK开发(C语言--动态内存分配)
  • 745
分享到

AndroidNDK开发(C语言--动态内存分配)

2024-04-02 19:04:59 745人浏览 安东尼
摘要

1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。

1.C 内存管理函数

C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。

序号 函数和描述
1 void calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 numsize 个字节长度的内存空间,并且每个字节的值都是0。
2 void free(void *address); 该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。
3 void *malloc(int num); 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
4 void *realloc(void *address, int newsize); 该函数重新分配内存,把内存扩展到 newsize。

2.C语音里面的内存划分

  • 栈区(栈内存,存放局部变量,自动分配和释放,里面函数的参数,方法里面的临时变量)
  • 堆区(动态内存分配,C语音里面由程序员手动分配),最大值为操作系统的80%
  • 全局区或静态区
  • 常量区(字符串
  • 程序代码区

3.静态与动态内存分配

在程序运行过程中,动态指定需要使用的内存大小,手动释放,释放之后这些内存还可以被重新使用。

静态内存分配,分配内存大小的是固定,产生的问题:

  • 1.很容易超出栈内存的最大值
  • 2.为了防止内存不够用会开辟更多的内存,容易浪费内存。

动态内存分配,在程序运行过程中,动态指定需要使用的内存大小,手动释放,释放之后这些内存还可以被重新使用

4.栈溢出

下面的代码会导致栈溢出:


void main(){
    //属于静态内存分配,分配到栈里面,Window里面每一个应用栈大概是2M,大小确定。与操作系统有关。
    int a [1024 * 1024 * 10 * 4];
}


该静态内存定义为40M,而Window里面每一个应用栈大概是2M,超出了范围, 会报stack overflow错误 。

5.动态内存分配与释放


//堆存分配,40M
//参数:字节 KB M 10M 40M
//开辟
int* p1 = (int*)malloc(1024*1024*10*sizeof(int));
//释放
free(p1);


通过动态内存分配来动态指定数组的大小:

在程序运行过长中,可以随意的开辟指定大小的内存,以供使用,相当于Java中的集合


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

//创建一个数组,动态指定数组的大小
void main() {
    //静态内存分配创建数组,数组的大小是固定的
    //int i = 10;
    //int a[i];

    int len;

    printf("输入数组的长度:");
    scanf("%d", &len);

    //开辟内存,大小内存len * 4 字节
    int* p = (int*)malloc(len * sizeof(int));//p:数组的首地址

    int i = 0;
    for (; i < len; i++) {
        p[i] = rand() % 100;
        printf("%d,%#x\n", p[i], &p[i]);
    }

    //手动释放内存
    free(p);

    getchar();

}

结果输出:

41,0x513f48
67,0x513f4c
34,0x513f50
0,0x513f54
69,0x513f58
24,0x513f5c

6.重新分配realloc

重新分配内存的两种情况:

缩小内存,缩小的那一部分数据会丢失
扩大内存,(连续的)

1.如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针
2.如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址
3.如果申请失败,返回NULL,原来的指针仍然有效


void main() {
    int len;
    printf("第一次输入数组的长度:");
    scanf("%d", &len);

    //开辟内存,大小内存len * 4 字节
    int* p = (int*)malloc(len * sizeof(int));//p:数组的首地址

    int i = 0;
    for (; i < len; i++) {
        p[i] = rand() % 100;
        printf("%d,%#x\n", p[i], &p[i]);
    }


    int addLen;
    printf("输入数组增加的长度:");
    scanf("%d", &addLen);


    int* p2 = (int*)realloc(p, sizeof(int) * (len + addLen));
    if (p2 == NULL) {
        printf("重新分配失败......");
    }

    printf("------------新数组-------------------\n");
    //重新赋值
    i = 0;
    for (; i < len + addLen; i++) {
        p2[i] = rand() % 200;
        printf("%d,%#x\n", p2[i], &p2[i]);
    }

    //手动释放内存 p2释放内存 p也会释放,因为给p2分配内存的时候要么p已经释放,要么p2、p指向统一地址区域
    if (p2 != NULL) {
        free(p2);
        p2 = NULL;
    }
    getchar();

}

结果输出:

第一次输入数组的长度:5
41,0x5e4ad8
67,0x5e4adc
34,0x5e4ae0
0,0x5e4ae4
69,0x5e4ae8
输入数组增加的长度:5
------------新数组-------------------
124,0x5e4ad8
78,0x5e4adc
158,0x5e4ae0
162,0x5e4ae4
64,0x5e4ae8
105,0x5e4aec
145,0x5e4af0
81,0x5e4af4
27,0x5e4af8
161,0x5e4afc

内存分配的几个注意细节:

  • 1.不能多次释放
  • 2.释放完之后(指针仍然有值),给指针置NULL,标志释放完成
  • 3.内存泄露(p重新赋值之后,再free,并没有真正释放内存)

避免内存泄漏:

p重新赋值之前先free

内存泄漏写法:


void main(){
    //40M
    int* p1 = malloc(1024 * 1024 * 10 * sizeof(int));
    //free(p1);
    //p1 = NULL;
    //错误,没有立即释放内存
    printf("%#x\n",p1);

    //80M
    p1 = malloc(1024 * 1024 * 10 * sizeof(int) * 2);
    
    free(p1);
    p1 = NULL;

    getchar();
}

打开任务管理器,看到有40M内存泄漏。

正确写法:


void main(){
    //40M
    int* p1 = malloc(1024 * 1024 * 10 * sizeof(int));
    free(p1);
    p1 = NULL;
    printf("%#x\n",p1);

    //80M
    p1 = malloc(1024 * 1024 * 10 * sizeof(int) * 2);
    
    free(p1);
    p1 = NULL;

    getchar();
}

打开任务管理器,看到内存只有0.3M,正常。

到此这篇关于Android NDK开发(C语言--动态内存分配)的文章就介绍到这了,更多相关Android NDK C语言动态内存分配内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: AndroidNDK开发(C语言--动态内存分配)

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

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

猜你喜欢
  • AndroidNDK开发(C语言--动态内存分配)
    1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 ...
    99+
    2024-04-02
  • C语言的动态内存分配及动态内存分配函数详解
    目录mallocmalloc的使用:freecalloccalloc的使用:reallocrealloc的使用改进:realloc的另一种用法:常见的动态内存错误对空指针的解引用操作...
    99+
    2024-04-02
  • C语言的动态内存如何分配
    今天小编给大家分享一下C语言的动态内存如何分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。动态内存分配的定义首先我们要搞清...
    99+
    2023-07-02
  • 详解C语言动态内存的分配
    目录C 程序中,不同数据在内存中分配说明内存动态分配的相关函数应用实例动态分配内存的基本原则总结C 程序中,不同数据在内存中分配说明 1)全局变量——内存中的...
    99+
    2024-04-02
  • AndroidNDK开发(C语言字符串)
    目录1.C语音的字符串有两种1.1字符数组1.2字符指针2.字符串常用的方法2.1strcpy字符串拼接2.2strchr字符串中查找字符2.3strchr字符串中查找字符2.4更多...
    99+
    2024-04-02
  • C语言如何实现动态内存分配
    今天小编给大家分享一下C语言如何实现动态内存分配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C语言动态内存分配的详解1.为...
    99+
    2023-06-16
  • C语言动态内存分配图文讲解
    目录思维导图1.为什么存在动态内存分配2.动态内存函数的介绍2.1 malloc2.2 free2.3 calloc2.4 realloc3.常见的动态内存错误思维导图 1.为什么...
    99+
    2023-01-17
    C语言动态内存分配 C语言动态内存分配函数
  • C语言动态内存分配怎么使用
    这篇文章主要介绍了C语言动态内存分配怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存分配怎么使用文章都会有所收获,下面我们一起来看看吧。一、动态内存分配的意义C语言中的一切操作都是基于内存的...
    99+
    2023-06-30
  • C语言中的动态内存分配实例分析
    本篇内容主要讲解“C语言中的动态内存分配实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中的动态内存分配实例分析”吧!什么是动态内存分配我们目前已经知道的内存开辟的方式有:int&n...
    99+
    2023-07-02
  • C语言动态内存的分配最全面分析
    目录为什么有动态内存分布malloc函数的使用free函数的用法calloc的用法realloc的使用方法柔性数组为什么有动态内存分布 大家发现一个问题没有,就是我们之前写代码创建数...
    99+
    2024-04-02
  • AndroidNDK开发(C语言-文件读写)
    目录1.文件读写 1.1打开文件 1.2关闭文件 1.3读取文件 1.4写入文件 1.5读写二进制I/O文件 1.6获取文件的大小 1.7文本简单加密、解密 1.8二进制文件简单加解...
    99+
    2024-04-02
  • C语言动态内存分配函数的实现
     在C中我们开辟内存空间有两种方式 : 1.静态开辟内存 :例如: int a;int b[10];  这种开辟内存空间的特点是 所开辟的内存是在栈中开...
    99+
    2024-04-02
  • C语言动态内存的分配实例详解
    目录前言动态内存分配的定义动态内存的优势<1>  可以控制内存的大小<2> 可以多次利用这部分空间<3>不占用栈区的内存malloc c...
    99+
    2024-04-02
  • C语言如何实现动态内存的分配
    这篇文章给大家分享的是有关C语言如何实现动态内存的分配的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C 程序中,不同数据在内存中分配说明1)全局变量&mdash;&mdash;内存中的静态存储区2...
    99+
    2023-06-22
  • C语言编程C++动态内存分配示例讲解
    目录动态内存管理为什么存在动态内存分配动态内存函数的介绍malloc申请空间和free释放空间有借有还 free释放内存calloc申请内存realloc调整动态内存的大小reall...
    99+
    2024-04-02
  • C语言动态开辟内存详解
    目录1.动态内存管理2.动态开辟内存函数的介绍2.1malloc和free函数2.2calloc函数2.3relloc函数总结1.动态内存管理 我们已经掌握的内存开辟方法,用的最多的...
    99+
    2024-04-02
  • C语言中关于动态内存分配的详解
    目录一、malloc 与free函数二、calloc三、realloc四、常见的动态内存的错误【C语言】动态内存分配 本期,我们将讲解malloc、calloc、realloc以及f...
    99+
    2024-04-02
  • 深入了解C语言中的动态内存分配
    目录什么是动态内存分配如何进行动态内存分配首先我要介绍两个函数 malloc 和 free第二个开辟空间的动态内存分配的函数 calloc大小修改函数realloc今天我们来学习一下...
    99+
    2024-04-02
  • C语言动态内存分配函数如何使用
    这篇文章主要介绍“C语言动态内存分配函数如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言动态内存分配函数如何使用”文章能帮助大家解决问题。局部变量和函数的形参向栈区申请空间全局变量和st...
    99+
    2023-06-30
  • C语言深入探索动态内存分配的使用
    目录一、动态内存分配的意义二、malloc 和 free三、关于 malloc(0)四、calloc 和 realloc五、小结一、动态内存分配的意义 C语言中的一切操作都是基于内存...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作