今天看公司的代码中有一个地方很是不解,大致情况如下:
首先定义一个缓冲区
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只是作为一个中转吧
时间: 2024-10-07 11:58:26