C ++字符串到字符串转换

时间:2014-03-13 18:04:06

标签: c++ c arrays string initialization

char ch[3];
strcpy(ch,"Hello");
cout<<ch<<" "<<sizeof(ch);

Q1。当ch的大小为3时,为什么打印“Hello”?

Q2。如果ch从ch [2]转换为ch [6](通过隐式类型转换),那么为什么sizeof(ch)仍然是3?

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无法知道它可以安全地复制多少个字符,因为指针只不过是一个内存地址。它不知道该位置有多少可用内存,因此即使(例如在您的情况下)您越界,也只需编写所有内容。

你的代码中的内容是指针被称为不安全的原因之一。