带有文本的char *是否像使用malloc一样自动保留内存?

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段中的文字?哇!

eer*_*ika 5

似乎会自动保留内存。没有malloc。

动态分配不是在C ++中获取内存的唯一方法。

该变量p具有自动存储功能。字符串文字是具有静态存储的数组。具有自动,静态或线程本地存储的对象将自动销毁。所有变量都具有这三个存储时间之一。

自动对象在(最窄的范围)范围的末尾被破坏,main返回时静态对象被破坏,线程退出时线程局部对象被破坏。

这是C / C ++标准还是特定于编译器?

示例程序大部分是标准程序,除了:

  • 您尚未包含保证声明的标头malloc
  • 您尚未在char*动态分配的内存中创建对象,因此从技术上讲,该程序的行为在C ++中是未定义的。有关如何解决此问题,请参见下面的PPPS。

PS指向带有char的非const指针的字符串文字是非常不安全的。试图通过此类指针修改文字在语法上是正确的,但程序的行为在运行时将不确定。使用const char*代替。方便地,您可以摆脱一些显式转换。

在C ++中,不建议使用PPS C风格的显式转换。使用static_castconst_castreinterpret_cast或者其组合来代替。

PPPS不建议malloc在C ++中使用。使用newnew[]代替...甚至更好,请参阅下一点。

PPPPS不建议拥有指向动态内存的裸机指针。使用RAII容器(例如std::vector此处)将是一个好主意。

PPPPPS您的示例程序泄漏了动态分配。这是避免裸露指针的原因之一。


那么在STACK上分配p指向HEAP中的一个内存块(数组),其中每个元素都指向(是一个指针)指向DATA段中的文字?

该语言本身与诸如堆栈和堆内存以及数据段之类的概念无关。这些是特定于您正在使用的系统上语言实现的详细信息。