优化struct LcdDevice *init_lcd(const char *device) { //申请空间 struct LcdDevice* lcd = malloc(sizeof(struct LcdDevice)); if(lcd == NULL) { return NULL; } //1打开设备 lcd->fd = open(device, O_RDWR); if(lcd->fd < 0) { perror("open lcd fail"); free(lcd); return NULL; } //映射 lcd->mp = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd->fd,0); return lcd; }
时间: 2024-03-03 10:49:22 浏览: 184
这段代码已经相对简洁,但是还可以进一步优化。下面是一些可能的优化方案:
1. 检查`open`和`mmap`函数的返回值,如果返回值小于0,直接返回`NULL`。
2. 将所有的指针变量初始化为`NULL`,这样可以避免释放未分配的内存空间。
3. 在函数结束时,检查指针变量是否为`NULL`,如果不是,则释放该指针变量指向的内存空间。
根据上述方案,下面是一个优化后的代码示例:
```c
struct LcdDevice *init_lcd(const char *device) {
// 初始化所有指针变量为NULL
struct LcdDevice *lcd = NULL;
void *mp = NULL;
// 申请内存空间
lcd = malloc(sizeof(struct LcdDevice));
if (lcd == NULL) {
return NULL;
}
// 打开设备文件
lcd->fd = open(device, O_RDWR);
if (lcd->fd < 0) {
perror("open lcd fail");
goto fail;
}
// 映射设备文件到内存空间中
mp = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd->fd, 0);
if (mp == MAP_FAILED) {
perror("mmap lcd fail");
goto fail;
}
// 将映射后的内存空间的指针赋值给mp成员变量
lcd->mp = mp;
// 函数正常返回
return lcd;
fail:
// 出现错误时,释放所有已经分配的内存空间
if (lcd != NULL) {
free(lcd);
}
if (mp != NULL) {
munmap(mp, 800 * 480 * 4);
}
return NULL;
}
```
在这个优化后的代码中,使用了`goto`语句来实现错误处理的跳转,以减少重复代码的数量。同时,在函数结束时,检查指针变量是否为`NULL`,如果不是,则释放该指针变量指向的内存空间,避免了可能出现的内存泄漏问题。
阅读全文