C语言 指针的使用

来源:互联网 发布:java socket 心跳机制 编辑:程序博客网 时间:2024/04/29 12:28

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;}
0 0
原创粉丝点击