zoukankan      html  css  js  c++  java
  • 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
    	",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
    ",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
    ",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;
    }
    
  • 相关阅读:
    Python 字典方法(.get .item)
    Python格式化输出
    R sprintf函数
    r 中sub() gsub()等匹配与替换函数
    R read.csv数据框
    C#中使用ref、out、params例子
    C#中的三种委托方式:Func委托,Action委托,Predicate委托
    tfs强制撤销解锁命令
    Json序列化与反序列化
    XPath语法在C#中使用XPath示例第二讲
  • 原文地址:https://www.cnblogs.com/dylancao/p/7932173.html
Copyright © 2011-2022 走看看