char ch[3];
strcpy(ch,"Hello");
cout<<ch<<" "<<sizeof(ch);
Q1。当ch的大小为3时,为什么打印“Hello”?
Q2。如果ch从ch [2]转换为ch [6](通过隐式类型转换),那么为什么sizeof(ch)仍然是3?
答案 0 :(得分:3)
strcpy没有进行大小检查,所以它只是在a的内存地址写入“Hello \ 0”,覆盖内存之后的内容。
没有执行转换,ch是char [3],因为它是在strcpy之前。
答案 1 :(得分:3)
我假设您键入char a[3];
时表示char ch[3];
。
A1:当您声明某个大小的数组时,你最多不超过它。如果你确实超过了这种情况,那么就会得到未定义的结果。
A2:你不能像这样转换它,所以这不是问题。
答案 2 :(得分:3)
你正在做一些非常危险的事情。这是使用std::string
的原因之一,您无需检查是否超出了简单复制范围。
问题1:
就像其他人已经说过的那样,打印出“Hello”是未定义的行为,任何事情都可能发生。但那还不是全部。像在代码中一样写出界限是危险的。你基本上得到了Buffer Overflow,如果你看一下维基百科上的例子,你会发现它与你得到的代码差不多。
问题2:
没有转换。当您致电strcpy(ch, "Hello");
数组ch
decays into a pointer时。 strcpy
无法知道它可以安全地复制多少个字符,因为指针只不过是一个内存地址。它不知道该位置有多少可用内存,因此即使(例如在您的情况下)您越界,也只需编写所有内容。
你的代码中的内容是指针被称为不安全的原因之一。