关于strcat函数的问题

今天看公司的代码中有一个地方很是不解,大致情况如下:

首先定义一个缓冲区

char KeyBuffer[256];

然后用strcat函数往缓冲区中添加字符

strcat(KeyBuffer, "abcddffgg");

接着看不懂的地方到了

if(strlen(KeyBuffer) > 550)
{
    //操作    
}

 

为什么要判断大于550呢,KeyBuffer只有256字节大小啊?

后来自己写了个小测试程序,如下:

int main(void)
{
    char Str[10];
    memset(Str, 0, sizeof(Str));

    strcat(Str, "aaaaaaaa");
    strcat(Str, "bbbbbb");
        
}

然后用vs2008调试,跟踪Str的内存情况

1、未初始化时

 

2、memset清0后

 

3、第一次strcat连接后

 

4、第二次strcat连接后

可以清晰的看到第二次strcat连接后,新添加的字符已经超过了KeyBuffer的缓冲区,但是它还是正常连接了,为什么呢?

来看看strcat的源码实现:

 

char *strat(char *dst, const char *src)
{
    char *cp = dst;
    while(*cp)
        cp++;
    while(*cp++ = *src++);
    return dst;
}

 

可以看到strcat每次连接后都会将连接字符串的'\0'标志也一起连接过来,因此虽然超过了缓冲区的大小,但是字符串实际上已经连接成功了。这个时候如果输出KeyBuffer,可以输出连接后正确的字符串,但是编译器会有一个栈溢出的错误。

其实说了不少,还是不清楚项目中为什么要这样用,可能是没法确定KeyBuffer的大小吧,在使用时将KeyBuffer中的内容拷贝到其它地方或者写入文件,KeyBuffer只是作为一个中转吧

 

posted @ 2015-05-28 11:17  丹京  阅读(420)  评论(0编辑  收藏  举报