c的内存分配

什么是进程?

通俗得说:进程就是一个正在运行的程序

计算机如何给进程分配内存?

计算机内存可以分为如下四区

1.zhan区 (临时变量存储区)
2.堆区 (动态分配的变量)
3.数据区 (常量,静态临时变量)
4.代码区(指令/函数)

程序源码经过编译,最终成一堆的 数据 和一堆的 指令

当一个进程被开启时,计算机将为该进程分配 1.zhan区 2.数据区 3.代码区 这三个区在编译时已经可以确定其大小

函数为单位的指令存放在代码区
常量,宏,静态临时变量存放在数据区
普通临时变量存放在zhan区

堆内存可以为多个进程提供存储空间。

可以通过 malloc(字节数)申请堆内存
通过free(malloc返回的指针) 释放内存,(记得将释放内存的变量指为NULL)

什么时候要动态分配内存?

  1. 写代码时不能确定内存大小时
  2. 所需要空间太大时(>512字节)

c代码中的数组存在zhan中还是堆中?

  1. 写代码时手动声明定义的数组,存在zhan中
  2. 写代码时调用类库申请分配空间得到的数组,存在堆中

malloc free 模板

必须引入的库


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

模板代码

int size = 10;
Type *p = NULL;
p = (Type *)malloc(size * sizeof(Type));
if(NULL==p){
    /*没有申请成功如何处理*/
}
memset(p, 0, size * sizeof(Type));
/**
自己业务代码
*/
free(p);
p = NULL;

memcpy , memmove

void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);

两者区别 点这里
主要区别在于如何对待重叠,memmove 可以确保重叠 也正确拷贝。

猜你喜欢

转载自blog.csdn.net/weixin_37077950/article/details/81073252