C语言 指针的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnu_fangzebin/article/details/54645526

C语言 指针

当使用变量时出现长度不定,譬如在串口通信中,有些通信协议是不定长的,那么这个就应该使用指针;如果使用数组的话,会有下面这两个小问题,

  1. 要将数组的大小要定的比较大,已保证能够容纳最大的指令,这个相对于短小的指令来说就显得太浪费数组的资源了
  2. 有时候定义的数组很大,对系统的栈的内存会有不小的压力,因为在局部变量的使用都是在栈上

基于上面这两个问题,可以使用指针来优化,指针可以在申请时指定长度,不用像数组只要定义了大小就不可改变;此外,指针的分配是在堆内存的,这时需要注意就是不要让这个指针成为野指针,或者忘了释放导致内存泄露。
下面就以一个小例子来说明下,这个是在FreeRTOS下使用的函数,所以内存分配函数和释放函数与标准库不一样。

1. 定义:

    BYTE * bybuf = NULL; //定义指针时赋值为NULL,避免该指针指到其他不可控的内存单元

2. 申请:

    bybuf = (BYTE *)pvPortMalloc(Len);//分配内存,len:长度
    //判断是否内存分配是否成功,若有NULL则内存分配失败
    if(NULL == bybuf)
    {
        return eeror;
    }

2. 初始化

    memset(bybuf, 0, Len);//将bybuf指向的内存单元初始化为0,并不是必须的,因为下面立刻又对该内存进行操作,会别重新赋值

3. 使用

对指针指向的内存单元进行赋值操作

    *bybuf = 0x11;
    *(bybuf+1) = 0x10;
    *(bybuf+2) = (BYTE)(screen_id>>8);
    *(bybuf+3) = (BYTE)screen_id;
    *(bybuf+4) = (BYTE)(control_id>>8);
    *(bybuf+5) = (BYTE)control_id;
    memcpy(bybuf+6, str, Len);

4. 释放

    //使用完毕后,要释放该指针,并重新赋值为NULL
    if(NULL != bybuf)
    {
        vPortFree(bybuf);
        bybuf = NULL;
    }

合起来的整个函数如下:

uint32_t SetTextValue(uint16_t screen_id, uint16_t control_id, uint8_t * str, uint16_t Len)
{
    uint32_t error = SYS_ERROR;

    BYTE *bybuf = NULL;
    bybuf = (BYTE *)pvPortMalloc(Len+6);
    if(NULL == bybuf)
    {
        return error;
    }

    *bybuf = 0xb1;
    *(bybuf+1) = 0x10;
    *(bybuf+2) = (BYTE)(screen_id>>8);
    *(bybuf+3) = (BYTE)screen_id;
    *(bybuf+4) = (BYTE)(control_id>>8);
    *(bybuf+5) = (BYTE)control_id;
    memcpy(bybuf+6, str, Len);
    //使用bybuf

    if(NULL != bybuf)
    {
        vPortFree(bybuf);
        bybuf = NULL;
    }
    return error;

}

猜你喜欢

转载自blog.csdn.net/jnu_fangzebin/article/details/54645526