c++ - 为char数组动态分配内存

标签 c++

对下一段代码有一些理解上的问题。

#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/

相关文章:

c++ - 如何构建具有特定签名的函数概念?

c++ - 如何以 2³² 为基数表示数字?

c++ - 帮助将字符串转换为 double?

c++ - 更正 size_t : %zu or %Iu? 的 printf 格式说明符

c++ - 模板参数类型成员上的运算符 << 仅在 clang 中导致错误

c++ - 如何抛出好的异常?

c++ - Lower_bound 抛出 "error C2914: ' std::lower_bound' :无法推导出模板参数,因为函数参数不明确”

c++ - 过载分辨率和通用引用参数

c++ - 将内存 "belonging"的意外使用调试到父函数

C++:如何提高经常被复制的自定义类的性能?