美文网首页
# 嵌入式C语言6--动态内存分配

# 嵌入式C语言6--动态内存分配

作者: xqiiitan | 来源:发表于2024-08-02 20:46 被阅读0次

10. 动态内存分配。

malloc (memory allocation) 申请一段连续空间,单位是字节。效率会更高。常用。
calloc (clear allocation) 申请一段连续空间+并把数据初始化(整数0,浮点0.0...)
realloc (reallocation) 修改空间大小,里面原有的数据不会丢失。
free (free) 释放空间。

#include<stdlib.h>
int main() {
    int* p = malloc(10* sizeof(int)); // 返回这段空间的首地址。 
    printf("%p\n", p);
    for(int i=0; i<10; i++) {
        // *(p+i) = (i+1) *10; // 第一种赋值。
        // 第二种赋值,仿数组。
        p[i] = (i+1) *10; // p[i],底层还是会转成 p+i. 然后解引用。
        
        // printf("%d ", *(p+i)); // 拿到值,并打印。
        printf("%d ", p[i]); // 数组的形式,取值。
    }
    
    int* p2 = calloc(10, sizeof(int)); 
    int *p3 = realloc(p, 20*sizeof(int)); // 扩容。
    free(p3); // 申请的空间不要再使用了,要释放内存空间。
}

10.1 malloc底层细节。

1,malloc创建空间的单位是字节,
申请空间成功,返回这个空间的首地址;
申请空间失败,返回NULL。
2,malloc返回的是void类型的指针,没有步长的概念,也无法获取空间中的数据,需要强转
void *p = malloc(100); void 类型的更有通用性。可以转其他类型。
3,malloc返回的仅仅是首地址,没有总大小,最好定义一个变量记录总大小
int* p = malloc(25* sizeof(int));
4,malloc申请的空间不会自动消失,如果不能正确释放,会导致内存泄露
5, malloc申请的空间过多,会产生虚拟内存
6, malloc申请的空间没有初始化值,需要先赋值才能使用

7, free释放完空间之后,空间中数据叫做脏数据,可能被清空,可能被修改为其他值
8,calloc就是在malloc的基础上多一个初始化的动作
9,realloc修改之后的空间,地址值有可能发生变化,也有可能不会改变,但是原本的数据不会丢失
10, realloc修改之后,无需释放原来的空间,函数底层会进行处理。只需要释放新的p2空间。
如果内存地址不变,底层在原来空间的后面接着申请;
内存地址改变了, 申请一个新的大的空间,把原来的数据拷贝到新的空间中,再把原来的空间free掉。

10.2 C语言的内存结构

代码区:运行时代码加载的区域;临时存储,不会运行里面的代码。
栈:函数运行的区域,变量、数组。
堆:malloc、calloc、realloc申请的内存。
初始化静态区:static全局变量,已初始化。
未初始化静态区:static全局变量,未初始化。
常量区:字符串 指针+双引号申请的。

相关文章

网友评论

      本文标题:# 嵌入式C语言6--动态内存分配

      本文链接:https://www.haomeiwen.com/subject/vcynhjtx.html