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

    一鼓作气,再而衰,三而竭
  • 相关阅读:
    hdu 1201 18岁生日
    线性代数
    关于pymongo的一些说明
    利用数组进行数据处理
    通用函数:快速的元素级数组函数
    IPython:一种交互式计算和开发环境
    关于一道面试题的思考
    wireshark中的抓包过滤器和显示过滤器
    wireshark推荐书籍
    wireshark 找不到网卡的解决办法
  • 原文地址:https://www.cnblogs.com/danjing/p/4535394.html
Copyright © 2011-2022 走看看