将动态大小的数据读入char *?

时间:2012-05-30 12:42:14

标签: c++ char

我想知道以下代码是如何工作的。

#include <iostream>
using namespace std;
int main()
{
    char* buffer = new char(NULL);
    while(true)
    {
        cin >> buffer;
        cout << buffer;
        cout << endl;
    }
    return 0;
}

我可以输入任意大小的任意数量的文本,然后将其打印回给我。这是如何运作的?它是否为我动态分配空间?

此外,如果我输入空格,它将在新行上打印下一部分文本。 但是,这可以通过使用gets(buffer);(不安全)来解决。

此外,此代码是否合法?

2 个答案:

答案 0 :(得分:5)

根本不安全。它正在重写缓冲区之后发生的任何内存,然后读取它。这是有效的事实。这是因为你的cin / cout操作没有说“哦,一个指向一个char的指针,我应该写一个char”但是“哦,你有足够的空间分配给我。”

改进#1:

char* buffer = new char(10000)或只是char buffer[10000];

现在你可以放心地编写长篇文章了。

改进#2:

std::string buffer;

要在评论中回答你的问题,C ++就是为了让你犯大错误。正如评论中所指出的那样,这是因为它是“不为你不需要的东西付费”的语言。有些人在他们的代码中确实需要这种级别的优化,尽管你可能不是其中之一。

然而,它也为你提供了很多方法,你根本不需要考虑内存。我会坚定地说:如果您使用的是newdelete或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将动态为您分配空间,因此您不必担心在其他位置覆盖内存。