基于strlen的意外成功复制

时间:2011-12-02 14:37:00

标签: 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;
        }

2 个答案:

答案 0 :(得分:6)

这称为未定义的行为 - 程序看起来有效,但你不能依赖它。

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

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

答案 1 :(得分:0)

考虑另一种做同样事情的方法:

 int main(){
          std::string mystr = "mineminemine";
          std::string mystr2 = mystr;
 }

在内部,您有一个添加了空终止字符的缓冲区。复制标准字符串时,不必担心跟踪缓冲区的开始和结束。

现在考虑字符串的生命周期,这两个变量在堆栈上声明,并在main超出范围时被销毁(例如,termina)。如果您需要在对象之间共享字符串,并且您不一定知道它们何时会被销毁,我建议您考虑使用boost共享指针。