基于strlen的意外成功复制

Abr*_*ile 1 c++ string buffer memcpy

我正在使用C++中的指针和缓冲区来检查我的技能.我尝试了下面的代码,一切正常.没有泄漏,没有崩溃,没有.

说实话,我没想到这一点.

当我打电话时,char* buf2 = new char[strlen(buf)]我没想到srlen(buf)返回合适的尺寸.我一直认为strlen 需要一个以NULL结尾的字符串才能工作.这不是这样的,为什么它正在使用这段代码?

        int main(){
             const char* mystr = "mineminemine";
             char* buf = new char[strlen(mystr)];
             memcpy(buf, mystr, strlen(mystr));

             char* buf2 = new char[strlen(buf)];
             memcpy(buf2, buf, strlen(buf));

             delete[] buf2;
             delete[] buf;
        }
Run Code Online (Sandbox Code Playgroud)

sha*_*oth 6

这称为未定义的行为 - 程序似乎有效,但你不能依赖它.

当分配内存时,会在某处发生一个空字符,该字符足够接近缓冲区的起始位置,并且程序可以在技术上访问该空字符和缓冲区起点之间的所有内存,这样您就不会发现崩溃.

你不能依赖这种行为.不要编写这样的代码,总是分配足够的空间来存储终止空字符.