Ant*_*eev 2 c++ pointers pointer-to-pointer
// Example program
#include <iostream>
#include <string>
using namespace std;
int main()
{
char **p;
p = (char **)malloc(100);
p[0] = (char *)"Apple"; // or write *p, points to location of 'A'
p[1] = (char *)"Banana"; // or write *(p+1), points to location of 'B'
cout << *p << endl; //Prints the first pointer
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中:
p[0] = (char *)"Apple";
Run Code Online (Sandbox Code Playgroud)
似乎会自动保留内存。没有malloc。这是C / C ++标准还是特定于编译器?
更新1 我实际上对它在C中然后在C ++中的状态很感兴趣。只是我没有为上述代码安装C编译器,因此我使用了C ++。
那么在STACK上分配p指向HEAP中的一个内存块(数组),其中每个元素都指向(是一个指针)指向DATA段中的文字?哇!
似乎会自动保留内存。没有malloc。
动态分配不是在C ++中获取内存的唯一方法。
该变量p具有自动存储功能。字符串文字是具有静态存储的数组。具有自动,静态或线程本地存储的对象将自动销毁。所有变量都具有这三个存储时间之一。
自动对象在(最窄的范围)范围的末尾被破坏,main返回时静态对象被破坏,线程退出时线程局部对象被破坏。
这是C / C ++标准还是特定于编译器?
示例程序大部分是标准程序,除了:
malloc。char*动态分配的内存中创建对象,因此从技术上讲,该程序的行为在C ++中是未定义的。有关如何解决此问题,请参见下面的PPPS。PS指向带有char的非const指针的字符串文字是非常不安全的。试图通过此类指针修改文字在语法上是正确的,但程序的行为在运行时将不确定。使用const char*代替。方便地,您可以摆脱一些显式转换。
在C ++中,不建议使用PPS C风格的显式转换。使用static_cast,const_cast或reinterpret_cast或者其组合来代替。
PPPS不建议malloc在C ++中使用。使用new或new[]代替...甚至更好,请参阅下一点。
PPPPS不建议拥有指向动态内存的裸机指针。使用RAII容器(例如std::vector此处)将是一个好主意。
PPPPPS您的示例程序泄漏了动态分配。这是避免裸露指针的原因之一。
那么在STACK上分配p指向HEAP中的一个内存块(数组),其中每个元素都指向(是一个指针)指向DATA段中的文字?
该语言本身与诸如堆栈和堆内存以及数据段之类的概念无关。这些是特定于您正在使用的系统上语言实现的详细信息。