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

    一鼓作气,再而衰,三而竭
  • 相关阅读:
    Oracle分析函数row_number()等的使用实例
    Oracle行列转换case when then方法案例
    Oracle日期函数
    Oracle转换函数
    Oracle数值函数
    Oracle字符函数length substr concat实例
    Oracle列转行函数LISTAGG()
    Oracle 条件判断函数decode和case when then案例
    Oracle NVL空值处理函数
    【学亮开讲】Oracle内外连接查询20181119
  • 原文地址:https://www.cnblogs.com/danjing/p/4535394.html
Copyright © 2011-2022 走看看