C ++和cin char数组的简单指针

时间:2014-09-25 02:42:01

标签: c++ pointers

#include <iostream>
using namespace std;

int main(void)
{
    char *YourName = new char[10];
    cout << "Enter your name:";
    cin >> YourName;
    cout << "\nHere is what your entered:" << YourName;
    return 0;
}

为什么这会存储超过10个字符(空格除外)?这是因为我创建的指针只指向字符数组吗?

4 个答案:

答案 0 :(得分:2)

未定义的行为意味着完全。未定义。

有时候,未定义意味着它可以按照你的预期运作,即使你的期望是错误的,尽管你用你的语言违反了合同: - )

对于细节,大多数内存分配例程将在某个“分辨率”上工作,例如16个字节(效率),这意味着请求将向上舍入到该值的下一个倍数。您可能会发现,在开始落入堆中之前,您可以使用最多16个字节的任何内容填充10字节缓冲区。

这不能让使用这个额外的空间,它只是解释了为什么它可能会有效。

答案 1 :(得分:1)

在一个更大更复杂的程序中,额外的字符会踩踏内存中的相邻变量。足够多的额外字符最终将触发操作系统保护,因为它可以访问尚未分配的内存。

指针指向。它没有任何属性可以知道它应该指向的长度。

答案 2 :(得分:0)

这就是为什么总是使用std::cin.getline(YourName,10),所以10之后的字符将被忽略。

答案 3 :(得分:0)

char*的提取器不知道数组的大小是什么,因此除非您明确告知,否则它不能在10个字符后停止提取。这很危险,因为它允许您输入的字符数多于分配给数组的字符数。这会导致未定义的行为。

这就是为什么建议您使用std::string而不是C风格的数组,因为当您添加更多字符时,其内部缓冲区的大小会增加。