今天调试代码中,遇到了一个比较奇怪的打印,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; }