标签:
首先定义一个缓冲区
char KeyBuffer[256];
然后用strcat函数往缓冲区中添加字符
strcat(KeyBuffer, "abcddffgg");
接着看不懂的地方到了
if(strlen(KeyBuffer) > 550) { //操作 }
后来自己写了个小测试程序,如下:
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只是作为一个中转吧
标签:
原文地址:http://www.cnblogs.com/danjing/p/4535394.html