本文主要是介绍C语言必须杜绝的低级错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如#define SMALL_BUFFER_SIZE ((REPLAY_PAGE_SIZE >> 3) + 64 )
此处移位处括号必须要加!
2、char **inode_large, **inode_small;
二级指针直接使用已经分配的区域代码相当简单,但是需要考虑内存中
实际分配的长度是否一致!
g_large_mem_buf = kmalloc(100);
如inode-large = (char **)g_large_mem_buf;
inode_small = (char **)(g_large_mem_buf + large_mem_len);
然后可直接使用inode_large[i] = ...; inode_small[i] = ...; 让每个指针指向相应的内存区域.
#include <stdio.h>int func()
{int a, b;a = b = 0;a++;b++;return a+b;
}struct test {int a;int b;int c;int d;
};int main()
{func();struct test t = {.a = 1,.b = 10,};struct test p[5] = {{.a = 0,.b = 0,},{.a = 1,.b = 11,},{.a = 2,.b = 22,},};struct test **pp = &p; // *pp 和*pp+1偏移量为16,而pp和pp+1的偏移量为一个指针长度,最后p和p+1的偏移量也为16printf("%p, %p, %p, %p, %p, %p, %p\n", pp, pp+1, *pp, *pp+1, *pp+2, p, p+1);
return 0;
}
结果为:
0x7fffe26653a0, 0x7fffe26653a8, (nil), 0x10, 0x20, 0x7fffe26653a0, 0x7fffe26653b0
3、宏中尽量避免使用可能为空的指针,此问题在kernel中可能导致空指针,若必须使用,请注意
仔细判断!
4、spin_lock_irqsave \ spin_unlock_irqrestore 锁的位置很重要!
首先需要保证锁的时间尽可能要短;其次再考虑锁的位置的合理性!
再者是锁了中断后,注意解锁的时机,如果代码在某处提前返回了,记得解锁,
同时在代码中某处可能下一条睡眠的地方,一定要先unlock,然后在睡眠结束后在lock上!!
以及当时没有返回,那在最后也要解锁,否则将导致死锁!!!!
5、看出错误在哪了么?花了我一个小时才发现的错误!!!
if (readl(_ISR(i2c) == 0x800)) {
// i2c_pxa_reset(i2c);PRINT(COMMON_DEBUG, "isr is 0x800. Error");
// return I2C_RETRY;}
6、指针传参不易发觉的错误
static struct phy_device *phy;
struct net_device *get_netdev(struct phy_device *p)
{p = phy;if (fastenet)return fastenet;elseprintk(KERN_ERR "fe dev is NULL\n");return NULL;
}
调用处p的值是phy么?实际上又错了,应该用二级指针!!!
struct net_device *get_netdev(struct phy_device **p)
{*p = phy;if (fastenet)return fastenet;elseprintk(KERN_ERR "fe dev is NULL\n");return NULL;
}
struct ic_device *d, *next;struct net_device *dev;rtnl_lock();next = ic_first_dev;while ((d = next)) { // 当NULL时while会终止!开始我也以为一直循环!next = d->next;dev = d->dev;if (dev != ic_dev) {DBG(("IP-Config: Downing %s\n", dev->name));dev_change_flags(dev, d->flags);}kfree(d);}
这篇关于C语言必须杜绝的低级错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!