对“c指针和内存分配”的一点小见解

本文详细探讨了在C/C++编程中使用malloc函数申请内存的场景与机制。通过对比直接赋值与malloc分配,解析了指针变量如何指向具体内存地址,以及malloc函数如何在内存中寻找未使用的区域进行分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

malloc分配内存,一般首先定义一个指针,然后将malloc函数返回的地址赋予该指针

u8 a;
u8 *P;

p = &a;

p = malloc(ram,1);

什么时候需要使用malloc申请内存?
定义了指针变量之后,要想使用它,(当然我们不是也不能因为定义了所以才使用它,而是应该因为要使用它所以才定义它)就得让它指向具体的内存,让它指向内存有两个办法:
1、就是用p=&a;或p=0x12324121这样的赋值语句为指针变量p赋值,即让其指向一个具体的内存地址(这个地址处的变量可能就是a),然后就可以引用指针来干事情了,例如
“*p= 5”就是让p指向的这个u8数据等于5;
2、就是使用malloc内存分配函数来让p指向一个具体的内存空间,p = malloc(ram,1);这个方法和上边的那个是不一样的,不一样的地方在于,上边的方法先定义一个变量a,再
将这个变量a的地址赋予这个指针变量p,这个变量a的地址在赋予这个指针变量p之前就是是确定的(当然,在这儿,我们使用“*p=5”相对于用“a=5”为a赋值来说有点无厘头,
之所以显得无厘头就是因为a的地址已经在定义a的时候确定了,我们完全可以直接为a赋值,而没必要非说向&a指向的内存中填5,什么时候才不会显得无厘
头,就是只定义了一个指针并对其赋了一个数字值的时候,就类似下边的32寄存器编程中一样,只是说TIM3的值是TIM3_BASE,没说TIM3指向哪个变量,这时,就可以有理由
的引用TIM3这个指针了,TIM3->ARR 、TIM3->PSC、TIM3->DIER)。
而第2种方法,是不确定的,随机的,这个原因,就要看malloc申请内存的机制了,这个malloc函数给我的感觉就是,在内存中找一块没有被用过的内存区域,看看参数中需要申请多少,
然后就截取多少,截取完之后把这一段内存的首地址返回,同时,标记这一段内存已经被使用(直到free函数将其释放,才能再次被申请)。

所以综上所述,一个指针变量,只要没有经过第一种方法直接为其赋值,那他这个指针变量必然是用来(“用来”而不是“要去”,我的认知中是“被动承接不是主动去要”)承接
malloc申请到的内存的首地址的,然后才能使用,否则其什么都不指向,用一个形象一点的例子说明就相当于,你是指挥官,命令士兵说,“往某某城市(某某城市相当于指针)发
射一枚导弹”,然后士兵肯定要知道这个城市的经纬度,假如你没告诉他经纬度,这个“某某城市”只是个能够代表任何经纬度的一个名词,无任何意义,那此时这个士兵肯定是懵逼
的。此时,你要告诉他具体经纬度了,用第一种方法,就是直接告诉他东经113:42北纬34:44,第二种,就相当于士兵就在那守着,你告诉他“某某城市需要轰炸一下”,然后你给他
一个U盘,士兵不需要知道这个U盘中存储的具体经纬度,也不需要知道轰炸的是一个城市还是一个岛屿,他只需要把这个U盘插在发射设备上,这个“某某城市”的指针就被赋予了
U盘这个malloc申请来的地址了。

#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define APB1PERIPH_BASE       PERIPH_BASE
#define TIM3_BASE             (APB1PERIPH_BASE + 0x0400)
#define TIM3                ((TIM_TypeDef *) TIM3_BASE)

typedef struct
{
  __IO uint16_t CR1;
  uint16_t  RESERVED0;
  __IO uint16_t CR2;
  uint16_t  RESERVED1;
  __IO uint16_t SMCR;
  uint16_t  RESERVED2;
  __IO uint16_t DIER;
  uint16_t  RESERVED3;
  __IO uint16_t SR;
  uint16_t  RESERVED4;
  __IO uint16_t EGR;
  uint16_t  RESERVED5;
  __IO uint16_t CCMR1;
  uint16_t  RESERVED6;
  __IO uint16_t CCMR2;
  uint16_t  RESERVED7;
  __IO uint16_t CCER;
  uint16_t  RESERVED8;
  __IO uint16_t CNT;
  uint16_t  RESERVED9;
  __IO uint16_t PSC;
  uint16_t  RESERVED10;
  __IO uint16_t ARR;
  uint16_t  RESERVED11;
  __IO uint16_t RCR;
  uint16_t  RESERVED12;
  __IO uint16_t CCR1;
  uint16_t  RESERVED13;
  __IO uint16_t CCR2;
  uint16_t  RESERVED14;
  __IO uint16_t CCR3;
  uint16_t  RESERVED15;
  __IO uint16_t CCR4;
  uint16_t  RESERVED16;
  __IO uint16_t BDTR;
  uint16_t  RESERVED17;
  __IO uint16_t DCR;
  uint16_t  RESERVED18;
  __IO uint16_t DMAR;
  uint16_t  RESERVED19;
} TIM_TypeDef;


void TIM3_Int_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR|=1<<1;    //TIM3时钟使能    
     TIM3->ARR=arr;      //设定计数器自动重装值//刚好1ms    
    TIM3->PSC=psc;      //预分频器7200,得到10Khz的计数时钟          
    TIM3->DIER|=1<<0;   //允许更新中断      
    TIM3->CR1|=0x01;    //使能定时器3
      MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2                                     
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值