#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个字符(空格除外)?这是因为我创建的指针只指向字符数组吗?
答案 0 :(得分:2)
未定义的行为意味着完全。未定义。
有时候,未定义意味着它可以按照你的预期运作,即使你的期望是错误的,尽管你用你的语言违反了合同: - )
对于细节,大多数内存分配例程将在某个“分辨率”上工作,例如16个字节(效率),这意味着请求将向上舍入到该值的下一个倍数。您可能会发现,在开始落入堆中之前,您可以使用最多16个字节的任何内容填充10字节缓冲区。
这不能让使用这个额外的空间,它只是解释了为什么它可能会有效。
答案 1 :(得分:1)
在一个更大更复杂的程序中,额外的字符会踩踏内存中的相邻变量。足够多的额外字符最终将触发操作系统保护,因为它可以访问尚未分配的内存。
指针指向。它没有任何属性可以知道它应该指向的长度。
答案 2 :(得分:0)
这就是为什么总是使用std::cin.getline(YourName,10)
,所以10之后的字符将被忽略。
答案 3 :(得分:0)
char*
的提取器不知道数组的大小是什么,因此除非您明确告知,否则它不能在10个字符后停止提取。这很危险,因为它允许您输入的字符数多于分配给数组的字符数。这会导致未定义的行为。
这就是为什么建议您使用std::string
而不是C风格的数组,因为当您添加更多字符时,其内部缓冲区的大小会增加。