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

5

我正在学习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. 在这种情况下,我怎样才能得到内存地址呢?

最好完全避免使用原始指针,而是使用智能指针或容器。 - o11c
3个回答

9
输出流的`operator<<`有一种重载方式,可以将字符数组解释为字符串而不是通用指针。因此,它打印字符串的值。要打印地址,请使用`static_cast(pvalue2)`。
对字符串进行取消引用会给出一个`char`,而不是一个字符串。
如果您正在使用C++,请优先考虑使用std::string而不是字符数组。如果需要某些东西的C风格字符串表示,可以通过调用`c_str()`方法来获取字符数组表示。

6
为什么指针pvalue2会给出所指向的字符串字面值而不是内存地址?
因为有一个特殊的重载<<,使得流输出char*将给出它指向的字符串,而不是指针值。这通常是你想要发生的。
"指针值"不总是它所指向的内存地址吗?
是的。
为什么解引用只会给出数组中的第一个字符?
因为指针包含单个对象的地址,而在这种情况下,该对象是数组的第一个元素。可以使用指针算术来访问其他元素,例如使用pvalue2[2]访问第三个元素。
在这种情况下,我如何获取内存地址?
要使用<<打印它,请转换为不同的指针类型以避免char*重载:
std::cout << static_cast<void*>(pvalue2);

0
  1. 我会在你的问题中引用"gives"而不是"pointed-to",因为前者在你的想法中有些模糊。你对对象的操作取决于你自己。pvalue2只是一个数字。

  2. 同样是“gives”。将指向char的指针解除引用会返回char本身。对于C字符串,它返回第一个字符。

  3. 当然,这就是指针的大部分内容了。剩下的是与类型本身固有的项目大小有关。(递增指针按项目大小递增,而不是1)。

  4. 什么情况下?如果你拥有一个指针,你已经拥有了内存地址。如果你拥有第一个字母(我猜是情况3),那就获取它的地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接