本帖最后由 wwwming0329 于 2015-12-18 11:21 编辑
写在前面:
本文就事论事不存在黑谁,针对谁的意图。只做技术讨论。
今天我们不谈C6748 开发板,我们来谈谈嵌入式开发中的C的malloc
想必大家都清除malloc函数的作用,就是申请一块内存。但是C语言并不会自动回收垃圾。So,能get正确malloc的使用方法的很少。
malloc的使用原则:
- 要判断返回值。要知道malloc申请内存是会失败的,你不判断下有没有申请成功就去操作?
- 要与free配合使用。有申请就要有释放。如果只申请不释放内存总会有用完的一天的。
- 避免野指针
来,咱们结合官方例程来看下。
下面是一个读取bmp图片的函数,注意第48,55行部分。对照上文的3点,首先,没有对malloc的返回值做判断,其次函数退出前释放申请的内存。
可以想象下,如果调用该函数多次读取bmp的结果。
- bmp ReadBmp(char *bmpName)
- {
- bmp m; // 定义一个位图结构
- FILE *fp;
- unsigned char *BmpBuf;
- int i;
- int bmpWidth; // 图像的宽
- int bmpHeight; // 图像的高
- int biBitCount; // 图像类型,每像素位数
- int lineByte;
- if((fp=fopen( bmpName, "rb"))==NULL)
- {
- printf( "can't open the bmp imgae.n ");
- exit(0);
- }
- else
- {
- fread(&m.file.bfType, sizeof(char), 2, fp); // 类型
- fread(&m.file.bfSize, sizeof(int), 1, fp); // 文件长度
- fread(&m.file.bfReserverd1, sizeof(short int), 1, fp); // 保留字 1
- fread(&m.file.bfReserverd2, sizeof(short int), 1, fp); // 保留字 2
- fread(&m.file.bfbfOffBits, sizeof(int), 1, fp); // 偏移量
- fread(&m.info.biSize, sizeof(int), 1, fp); // 此结构大小
- fread(&m.info.biWidth, sizeof(int), 1, fp); // 位图的宽度
- fread(&m.info.biHeight, sizeof(int), 1, fp); // 位图的高度
- fread(&m.info.biPlanes, sizeof(short), 1, fp); // 目标设备位图数
- fread(&m.info.biBitcount, sizeof(short) ,1, fp); // 颜色深度
- fread(&m.info.biCompression, sizeof(int), 1, fp); // 位图压缩类型
- fread(&m.info.biSizeImage, sizeof(int), 1, fp); // 位图大小
- fread(&m.info.biXPelsPermeter, sizeof(int), 1, fp); // 位图水平分辨率
- fread(&m.info.biYPelsPermeter, sizeof(int), 1, fp); // 位图垂直分辨率
- fread(&m.info.biClrUsed, sizeof(int), 1, fp); // 位图实际使用颜色数
- fread(&m.info.biClrImportant, sizeof(int), 1, fp); // 位图显示中比较重要颜色数
- }
- // 获取图像宽、高、每像素所占位数等信息
- bmpWidth = m.info.biWidth;
- bmpHeight = m.info.biHeight;
- biBitCount = m.info.biBitcount;
- // 定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
- lineByte = (bmpWidth*biBitCount/8+3)/4*4;
- // 灰度图像有颜色表,且颜色表表项为256
- if(biBitCount == 8)
- {
- // 分配内存空间
- m.pColorTable = (RGBQUAD *)malloc(256*4);
- // 申请颜色表所需要的空间,读颜色表进内存
- fread(m.pColorTable, sizeof(RGBQUAD), 256, fp);
- }
- // 分配内存空间
- m.imgBuf = (unsigned char *)malloc(m.info.biSizeImage);
- BmpBuf = (unsigned char *)malloc(m.info.biSizeImage);
- // 读位图数据
- fread(BmpBuf, lineByte * bmpHeight, 1, fp);
- // 将读到的数据垂直镜像翻转
- for(i = 0; i < bmpHeight; i++)
- memcpy((void *)(m.imgBuf + lineByte * i),
- (void *)(BmpBuf + lineByte * (bmpHeight - i - 1)), lineByte);
- // 关闭文件
- fclose(fp);
- return m;
- }
复制代码
其他就不列举了,希望大家在实际开发中多多注意,写出健壮的代码。
1
|
|
|
|