码迷,mamicode.com
首页 > 其他好文 > 详细

关于strcat函数的问题

时间:2015-05-28 12:14:43      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

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

首先定义一个缓冲区

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只是作为一个中转吧

 

关于strcat函数的问题

标签:

原文地址:http://www.cnblogs.com/danjing/p/4535394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!