Zhang Jiuan’ Notes

关于’\0′, NULL和0的总结

一段字符串拷贝的代码,相来了相关朋友的讨论,本人感到十分开心。因为许于许多细节上,应该讨论越多,对问题的本质认识就越清楚。现在笔者把相关讨论专门总结为一篇日志。

经过:

首先笔者写了字符串拷贝的代码,没有经过调试,也存在bug和效率问题,如下:

char * strlcpy(char *dest, const char *src, size_t dest_buf_size)
{
    int i = 0;
    int src_len = 0;
   
    if (NULL == dest || NULL == src) {
        return NULL;
    }

    src_len = strlen(src);
   
    for (i = 0; i < src_len && i < dest_buf_size; i++) {
        dest[i] = src[i];
    }

    if (i == dest_buf_size) {
        dest[dest_buf_size - 1] = ”;
    }

    return dest;
}

Hacker_QC指正,作了一遍修改,修改后如下:

char * strlcpy(char *dest, const char *src, int dest_buf_size)
{
    int i = 0;
  
    if (NULL == dest || NULL == src) {
        return NULL;
    }  

    while (src[i] != ‘\0′ && i < dest_buf_size - 1) {
        dest[i] = src[i];
        i++;
    }  

    dest[i] = ‘\0′;

    return dest;
}

再往后就主要纠结到NULL,’\0′的0值问题上了,的确NULL, 0, ‘\0′本质要在内存里就是一个0,但我个人还是认识NULL和’\0′的存在是有一定道理的,并不是大部分人不知道可以这么写。现把优点总结如下:

对于一个变量应具备一些必须属性,比如值,类型和空间。程序员在编程的时候应该对这些做道心中有数,也近量做到让读者读到这里心中有数。

比如对于变量的比较:
如果统一使 if (var),那么在别人阅读自已代码的时候,就不会立刻反应到这个变量的类型是什么。
但如果统一了规范,if (var)bool; if (NULL == p)指针; if (0 ==var)整型就量; if (PRECISE > |var|),那么对于代码的阅读者是十分有益的,在读到这一行代码的时候,可以有意识的加强读者对该变量类型的认识。对于编程者,写到这些代码的时候也是一样。

代码量小了,一般都能做到对自已定义的变量类型值心中有数,但如果服务代码量达到一定的量级,这些规范就会显出一定的作用了。

但是,对于许多忠城的C++程序员,早就习惯了全0的写法,因此这些并不是一些硬性规定,只是一个建议罢了。

If you enjoyed this post, make sure you subscribe to my RSS feed!

No Comments, Comment or Ping

Reply to “关于’\0′, NULL和0的总结”

You must be logged in to post a comment.

返回顶部