我想知道以下代码是如何工作的。
#include <iostream>
using namespace std;
int main()
{
char* buffer = new char(NULL);
while(true)
{
cin >> buffer;
cout << buffer;
cout << endl;
}
return 0;
}
我可以输入任意大小的任意数量的文本,然后将其打印回给我。这是如何运作的?它是否为我动态分配空间?
此外,如果我输入空格,它将在新行上打印下一部分文本。
但是,这可以通过使用gets(buffer);
(不安全)来解决。
此外,此代码是否合法?
答案 0 :(得分:5)
根本不安全。它正在重写缓冲区之后发生的任何内存,然后读取它。这是有效的事实。这是因为你的cin / cout操作没有说“哦,一个指向一个char的指针,我应该写一个char”但是“哦,你有足够的空间分配给我。”
改进#1:
char* buffer = new char(10000)
或只是char buffer[10000]
;
现在你可以放心地编写长篇文章了。
改进#2:
std::string buffer;
要在评论中回答你的问题,C ++就是为了让你犯大错误。正如评论中所指出的那样,这是因为它是“不为你不需要的东西付费”的语言。有些人在他们的代码中确实需要这种级别的优化,尽管你可能不是其中之一。
然而,它也为你提供了很多方法,你根本不需要考虑内存。我会坚定地说:如果您使用的是new
和delete
或char []而不是因为您使用的是您熟悉的设计模式,需要它们,或者因为您使用的是需要它们的聚会或C库,有一种更安全的方法。
一些可以节省80%时间的指南:
- 不要使用char []。使用字符串。
- 不要使用指针来传递或返回参数。通过引用传递,按值返回。
- 不要使用数组(例如int [])。使用矢量。你仍然需要检查你自己的界限。
只有这三个你就会写“非常安全”,非C类代码。
答案 1 :(得分:3)
这是std::string
的用途:
std::string s;
while (true)
{
std::cin >> s;
std::cout << s << std::endl;
}
std::string
将动态为您分配空间,因此您不必担心在其他位置覆盖内存。