【问题标题】:How to allocate memory dynamically for a char array in C++?如何在 C++ 中为 char 数组动态分配内存?
【发布时间】:2015-08-09 13:03:43
【问题描述】:

我正在学习 C++ 中的动态内存。例如,作为对任何数据类型进行动态分配和解除分配的标准方法,我学到的是,

//For double,
double* pvalue1 = nullptr;
pvalue1 = new double;
*pvalue1 = 17.3;
delete pvalue1; //free up when I'm done

但是,对于 char 数组,我了解到它的处理方式不同:

char* pvalue2 = nullptr;
pvalue2 = new char[6];
strncpy(pvalue2,"Hello",sizeof("Hello"));

std::cout << "Pointed-to value of pvalue2 is " << *pvalue2 << std::endl;
std::cout << "Value of pvalue2 is " << pvalue2 << std::endl;

delete [] pvalue2; //free up when I'm done

然后,在命令提示符下:

Pointed-to value of pvalue2 is H
Value of pvalue2 is Hello
  1. 为什么指针pvalue2 给出“指向”字符串字面量 而不是内存地址? “指针值”不总是它指向的内存地址吗?
  2. 为什么解引用只给出数组中的第一个字符?
  3. 在这种情况下,我怎样才能获得内存地址?

【问题讨论】:

  • 最好完全避免使用原始指针,使用智能指针或容器。

标签: c++ arrays pointers char dynamic-memory-allocation


【解决方案1】:

输出流的operator&lt;&lt;char* 有重载,它将字符数组解释为字符串而不是通用指针。因此,它打印字符串的值。使用static_cast&lt;void*&gt;(pvalue2) 打印地址。

解除对字符串的引用会给你一个char,它不是一个字符串。

如果您使用 C++,最好使用 std::string 而不是字符数组。如果你需要一个 C 风格的字符串,你可以通过调用 c_str() 方法得到字符串的字符数组表示。

【讨论】:

    【解决方案2】:

    为什么指针 pvalue2 给出的是“指向”字符串字面量而不是内存地址?

    因为&lt;&lt; 有一个特殊的重载,所以流式char* 将给出它指向的字符串,而不是指针值。这通常是您希望发生的事情。

    “指针值”不总是它指向的内存地址吗?

    是的。

    为什么解引用只给出数组中的第一个字符?

    因为指针包含单个对象的地址,在这种情况下是数组的第一个元素。可以使用指针算法访问其他元素,例如pvalue2[2] 第三个元素。

    在这种情况下,我怎样才能获得内存地址?

    要使用&lt;&lt; 打印它,请转换为不同的指针类型以避免char* 重载:

    std::cout << static_cast<void*>(pvalue2);
    

    【讨论】:

      【解决方案3】:
      1. 我会在您的问题中引用“给予”而不是“指向”,因为前者在您的脑海中是模糊的。你对对象做什么取决于你。 pvalue2 只是一个数字。

      2. 同样的“给予”。取消引用指向char 的指针会返回char 本身。对于 C 字符串,它返回第一个字符。

      3. 当然,这就是最重要的指针。其余的是项目大小,类型本身固有的。 (递增指针以项目大小递增,而不是 1)。

      4. 在什么情况下?如果你持有一个指针,你已经有了内存地址。如果你拿着第一个字母(我猜是第 3 种情况),请记下它的地址。

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多