在C中复制字符串时,为空终止字符分配空间?

Pol*_*878 4 c++ c-strings

const char*src ="你好";

调用strlen(src);返回大小为5 ...

现在说我这样做:

char* dest = new char[strlen(src)];
strcpy(dest, src);
Run Code Online (Sandbox Code Playgroud)

这似乎不应该工作,但当我输出一切看起来正确.好像我最后没有为空终结器分配空间......这是对的吗?谢谢

Gre*_*ill 15

您没有为终结器分配空间是正确的,但是如果不这样做,则不一定会导致程序失败.您可能会覆盖堆上的以下信息,或者您的堆管理器将分配大小四舍五入到16个字节的倍数,因此您不一定会看到此错误的任何可见效果.

如果您在Valgrind或其他堆调试器下运行程序,您可能能够更快地检测到此问题.


Jul*_*ano 11

是的,你应该至少分配strlen(src)+1个字符.


Chr*_*utz 7

这似乎不应该工作,但当我输出一切看起来正确.

欢迎来到未定义行为的世界.当你这样做时,任何事情都可能发生.您的程序可能会崩溃,您的计算机可能会崩溃,您的计算机可能会爆炸,恶魔可能会飞出你的鼻子.

最糟糕的是,你的程序可以运行得很好,不显眼地看起来它正常工作,直到有一天它开始吐出垃圾,因为它在某处覆盖了敏感数据,因为在某个地方,有人为它们的数组分配了太少的字符,以及现在你已经损坏了堆,并且你在一百万英里之外的某个地方遇到了一个段错误,甚至更糟糕的是你的程序很快就会随着一堆损坏的堆积而突然出现,而且你的功能在损坏的信用卡号码上运行,你会遇到很大麻烦.

即使看起来它有效,但事实并非如此.这是未定义的行为.避免它,因为你永远无法确定它会做什么,即使它在你尝试它时它做了什么也没关系,它可能在另一个平台上没有问题.