如何在 C++ 中为 char 数组动态分配内存?
How to allocate memory dynamically for a char array in C++?
我正在学习 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
- 为什么指针
pvalue2
给出了"pointed-to"字符串字面量
而不是内存地址? "pointer value" 不就是它指向的内存地址吗?
- 为什么取消引用只给出数组中的第一个字符?
- 在这种情况下,我怎样才能得到内存地址呢?
输出流的 operator<<
重载了 char*
,它将字符数组解释为字符串而不是通用指针。因此,它打印字符串的值。使用static_cast<void*>(pvalue2)
打印地址。
取消引用字符串会得到一个 char
,它不是字符串。
如果您使用的是 C++,最好使用 std::string
而不是字符数组。如果你需要一个 C 风格的字符串,你可以通过调用 c_str()
方法来获得字符串的字符数组表示。
Why does the pointer pvalue2 give the "pointed-to" string literal instead of the memory address?
因为 <<
有一个特殊的重载,所以流 char*
将给出它指向的字符串,而不是指针值。这通常是您希望发生的事情。
Isn't a "pointer value" always the memory address which it points to?
是的。
Why does dereferencing give only the first character in the array?
因为指针包含单个对象的地址,在本例中是数组的第一个元素。可以使用指针算法访问其他元素,例如pvalue2[2]
为第三个元素。
How can I get the memory address then, in this case?
要用 <<
打印它,转换为不同的指针类型以避免 char*
过载:
std::cout << static_cast<void*>(pvalue2);
我会在你的问题中引用 "gives" 而不是 "pointed-to" 因为前者在你的脑海中是模糊的。你对对象做什么取决于你。 pvalue2
是只是一个数字。
相同"gives"。很好地取消引用指向 char
returns 的指针 char
本身。对于 C 字符串,它 returns 第一个字符。
当然,最重要的是指针。其余的是项目大小,类型本身固有的。 (递增指针按项目大小递增,而不是 1)。
在什么情况下?如果你持有一个指针,你就已经有了内存地址。如果您持有第一个字母(我猜是情况 3),请获取其地址。
我正在学习 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
- 为什么指针
pvalue2
给出了"pointed-to"字符串字面量 而不是内存地址? "pointer value" 不就是它指向的内存地址吗? - 为什么取消引用只给出数组中的第一个字符?
- 在这种情况下,我怎样才能得到内存地址呢?
输出流的 operator<<
重载了 char*
,它将字符数组解释为字符串而不是通用指针。因此,它打印字符串的值。使用static_cast<void*>(pvalue2)
打印地址。
取消引用字符串会得到一个 char
,它不是字符串。
如果您使用的是 C++,最好使用 std::string
而不是字符数组。如果你需要一个 C 风格的字符串,你可以通过调用 c_str()
方法来获得字符串的字符数组表示。
Why does the pointer pvalue2 give the "pointed-to" string literal instead of the memory address?
因为 <<
有一个特殊的重载,所以流 char*
将给出它指向的字符串,而不是指针值。这通常是您希望发生的事情。
Isn't a "pointer value" always the memory address which it points to?
是的。
Why does dereferencing give only the first character in the array?
因为指针包含单个对象的地址,在本例中是数组的第一个元素。可以使用指针算法访问其他元素,例如pvalue2[2]
为第三个元素。
How can I get the memory address then, in this case?
要用 <<
打印它,转换为不同的指针类型以避免 char*
过载:
std::cout << static_cast<void*>(pvalue2);
我会在你的问题中引用 "gives" 而不是 "pointed-to" 因为前者在你的脑海中是模糊的。你对对象做什么取决于你。
pvalue2
是只是一个数字。相同"gives"。很好地取消引用指向
char
returns 的指针char
本身。对于 C 字符串,它 returns 第一个字符。当然,最重要的是指针。其余的是项目大小,类型本身固有的。 (递增指针按项目大小递增,而不是 1)。
在什么情况下?如果你持有一个指针,你就已经有了内存地址。如果您持有第一个字母(我猜是情况 3),请获取其地址。