zoukankan      html  css  js  c++  java
  • 关于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每次连接后都会将连接字符串的''标志也一起连接过来,因此虽然超过了缓冲区的大小,但是字符串实际上已经连接成功了。这个时候如果输出KeyBuffer,可以输出连接后正确的字符串,但是编译器会有一个栈溢出的错误。

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

    一鼓作气,再而衰,三而竭
  • 相关阅读:
    女人的话中话(英文版),供男生参考哦
    那个时候的我(漫画连载)
    杨过与小龙女
    盛大正式收购SINA19.5%股份
    揭开SVCHOST.exe进程之谜
    该呼呼咯,各位朋友晚安~
    图解学说上海话
    2005年的12个祝福(2005年传统精美挂历)
    iframe 的自适应高度
    【蜡笔小新全集】+动漫【灌蓝高手】 高速在线看
  • 原文地址:https://www.cnblogs.com/danjing/p/4535394.html
Copyright © 2011-2022 走看看