相信大家都发现,用MSDN查询函数说明时,都会看到大部分字符串参数都要求是以NULL结尾,以前没有细想,今天突然想了想并尝试了一下,发现原来是这么一回事。

  先展示一段代码:


char a[5] = "test";
*(a+4) = 't';//或者a[4] = 't';
printf("%s", a);
  这段代码将字符数组a的最后一个字符改为t,导致输出了test烫烫烫(test后面是乱码,乱码内容视内存分配而定)


  为什么会输出乱码,因为字符串(也是字符数组)a的终止符由NULL(内存是00,可以调试程序,按Alt+6并输入a的地址查看a的内存值)变成了t,导致输出时在字符串a里找不到终止符,于是就往后面找,直到找到终止符NULL,如果这时获取a的长度,你会发现,a的长度不再是4,而是4加上后面的乱码长度之和。

  说回这次文章的本意,为什么很多字符串函数的字符串参数都需要是以NULL结尾,因为它怕你给的实参是上面的那种情况,函数执行后,结果是一堆乱码,导致程序出现不可收拾的后果,那时候就麻烦了。

 举个简单的例子,你想查找一个字符串中是否含有某个字符串,查找字符串可以用strstr函数,MSDN解释就说明参数是以NULL结尾的字符串,你给的目标字符串是test,查找的字符串是k,本应该是找不到的,但你给的目标字符串出现了上面的情况,导致目标字符串是test烫烫kkk烫烫,于是乎就找到了k,如果你的程序比较小,可能还比较容易找到这个bug,但如果是大工程,那就比较麻烦了,所以MSDN就明确说明了很多函数的字符串参数都需要是以NULL结尾,到时出问题就不是它的问题了,而是你的问题。

  上面是我的个人理解,如果有不对的地方,希望大家指点,如果你也有类似的想法,欢迎写文章fenxiang。