对下一段代码有一些理解上的问题。
#include<iostream>
using namespace std;
int main() {
char *str = "hi";
char *p = new char[strlen(str) + 1];
for (int i = 0; *(str + i); i++)
*(p + i) = *(str + i);
cout << p << endl;
return 0;
}
结果如下:
hi═¤¤¤¤
当我使用调试器时,我可以看到我的 p 指向一个包含 10 或 15 个或其他数量符号的数组(取决于编译),所以我得到了额外的“嗨”后的符号。但是,当我使用 strcpy() 时:
#include<iostream>
using namespace std;
int main() {
char *str = "hi";
char *p = new char[strlen(str) + 1];
strcpy(p, str);
cout << p << endl;
return 0;
}
我正在得到结果:
hi
那么,有人可以向我解释一下,为什么我在第一个程序示例中会得到这样的结果,以及如何对其进行修改以获得第二个示例中的结果。 提前致谢。
最佳答案
答案在循环的停止条件中,即*(str + i)
:
for (int i = 0 ; *(str + i) ; i++)
*(p + i) = *(str + i);
请注意,表达式中没有比较运算符。当在需要逻辑条件的上下文中使用这样的表达式时,会隐式比较零,即 *(str + i)
与 *(str + i) != 0
.
现在应该清楚为什么字符串保持未终止:循环在发现空终止符时停止,并且不会将其复制到目标字符串中。
做同样事情的一种稍微“隐秘”的方法是将比较与作业结合起来,就像 K&R 书所做的那样:
for (int i = 0 ; *(p + i) = *(str + i) ; i++)
;
现在 null 测试发生在赋值之后,确保目标以 null 终止。
关于c++ - 为char数组动态分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52596623/