在“经验教训”这个分类中,我会将自己工作过程中遇到的一些错误进行记录,防止以后再犯类似的错误,希望也能给其他人一些警示。其实在写代码的时候,每个人肯定都想将自己学到的一些忠告或者技巧应用在自己的代码中,但是如果利用不好,反而会弄巧成拙。有时,你遇见非常奇怪的BUG,大多数时候都是因为犯了一些你自己都认为“很二”的一些低级错误,或者过多地追求技巧。我今天犯的这个错误,就让我无比蛋疼。出现错误的代码如下(部分):
bzero(ip, ip_len);
inet_ntop(AF_INET, &machine->addr.sin_addr.s_addr, ip, ip_len);
for (i = 0; i < machine->virtual_nodes; ++i) {
ip_len = sprintf(ip, "%s#%d\n", ip, i);
key = hash_key(buf, ip_len, hashtable_size);
出现问题的代码在这句ip_len = sprintf(ip, "%s#%d\n", ip, i);。sprintf对使用C语言的人来说应该不陌生吧,第一个参数是要输出的对象,所以我的这句的意思是要把ip和i进行组合后输出到一个缓冲区,然后再hash_key函数中使用。我这里为什么要重复使用ip呢,因为我写这部分代码的时候只考虑了节省空间。但是这个语句是在一个for循环里面的,每次更改ip缓冲区后,sprintf的第三个参数也会跟着变化,但是这跟要实现的功能是不同的。当然这么说看的人肯定会糊涂,因为根本就不了解要实现什么功能,但是应该可以看懂我想说明的错误吧。
其实节省空间有时是把双刃剑,在真正的生产环境中不是不建议,但是要慎重。一旦出现问题,你要进行调试,所以肯定要对一些参数的输入输出信息进行查看,而此时某些空间的重用,导致一些肯能关键的数据信息成为脏数据。所以,节省空间,一定要慎重!