C语言中静态申请内存遇到的错误分析

  今天调试代码中,遇到了一个比较奇怪的打印,dump出来的数据只有前四位有值,其他后面的都为零。

出于直觉,应该是内存没有申请到。仔细核对代码之后,果真发现了一个语法错误,就是使用指针的指针时

,对申请到的内存取址错误,函数如下:

  void buff_alloc_check(unsigned char **buff, unsigned int len)

使用方法:

        unsigned char *ibuff = NULL;
        buff_alloc_check(ibuff,ilen);

奇怪的是,系统针对这个并没有报错,后来分析ARM系统发现,这个小系统的检查有关系,我所用的小系统没有

此项检查。

  在Linux上写了一个验证程序,发现是编译不过的。说明不同的系统对编译语法的检查是不一样的。在这里,

暴露了自身在基础上的薄弱,C语言基础仍旧不够好,这个以后要多加;练习。

  为了防止再犯类似的错误,我就在Linux上重新实现了一遍,这样加深理解吧。

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

#define BUFF_SIZE 2048

static unsigned char iarray[BUFF_SIZE];

unsigned int ibuff_used = 0;

unsigned int buff_alloc_free()
{

        return BUFF_SIZE - ibuff_used;
}

void buff_alloc_check(unsigned char **buff, unsigned int len)
{
        if(len > buff_alloc_free())
        {
        printf("alloc fialed len:%d freed:%d\n\t",len,buff_alloc_free());
        assert(len > buff_alloc_free());
        }

        *buff = iarray + ibuff_used;
        ibuff_used += len;
}
void HexDump(char *buf,int len,int addr)
{
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}

int main()
{
        unsigned char *ibuff = NULL;
        int ilen = BUFF_SIZE - 1;
        for(int icnt = 0; icnt < BUFF_SIZE; icnt++)
        {
                iarray[icnt] = icnt % 0xFF;
        }

        buff_alloc_check(&ibuff,ilen);
        HexDump(ibuff,ilen,(int)ibuff);

        return 0;
}

 

转载于:https://www.cnblogs.com/dylancao/p/7932173.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值