如何在C ++中为char数组动态分配内存?

时间:2015-05-27 12:32:22

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

我正在学习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. 在这种情况下,如何获取内存地址?

3 个答案:

答案 0 :(得分:9)

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

取消引用该字符串会为您提供char,而不是字符串。

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

答案 1 :(得分:6)

  

为什么指针pvalue2给出&#34;指向&#34;字符串文字而不是内存地址?

因为<<有一个特殊的重载,所以流char*会给它指向的字符串,而不是指针值。这通常是你想要发生的事情。

  

不是&#34;指针值&#34;总是它指向的内存地址?

  

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

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

  

在这种情况下,如何获取内存地址?

要使用<<进行打印,请转换为其他指针类型以避免char*重载:

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

答案 2 :(得分:0)

  1. 我已引用&#34;给出&#34;在你的问题而不是&#34;指向&#34;因为前者在你的脑海中是模糊的。你用对象做什么取决于你。 pvalue2 只是一个数字。

  2. 相同&#34;给出&#34;。取消引用指向char的指针会返回char本身。对于C字符串,它返回第一个字符。

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

  4. 在什么情况下?如果你持有一个指针,你已经拥有了内存地址。如果您持有第一个字母(我猜是案例3),请取其地址。