gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:07 25 4
gpt4 key购买 nike

// 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
}

在上面的代码中:

p[0] = (char *)"Apple"; 

似乎自动保留内存。没有 malloc。这是 C/C++ 标准还是特定于编译器?

更新 1我实际上对它在 C 和 C++ 中的表现很感兴趣。只是我没有为上面的代码安装C编译器,所以我使用了C++。

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

最佳答案

seems to reserve memory automatically. There is no malloc.

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

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

自动对象在(最窄的周围)作用域结束时销毁,静态对象在 main 返回后销毁,线程本地对象在线程退出时销毁。

Is this C/C++ standard or compiler specific?

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

  • 您没有包含保证声明 malloc 的 header 。
  • 您还没有在动态分配的内存中创建 char* 对象,因此从技术上讲,该程序的行为在 C++ 中是未定义的。见 P.P.P.S.下面介绍如何解决此问题。

附言使用指向 char 的非常量指针指向字符串文字是非常不安全的。尝试通过此类指针修改字面量在语法上是正确的,但程序的行为在运行时将是未定义的。请改用 const char*。方便的是,您可以摆脱一些显式转换。

附言在 C++ 中不推荐 C 风格的显式转换。请改用 static_castconst_castreinterpret_cast 或它们的组合。

P.P.P.S.不建议在 C++ 中使用 malloc。使用 newnew[] 代替……或者更好,请参阅下一点。

P.P.P.P.S.不建议拥有指向动态内存的裸指针。在此处使用诸如 std::vector 之类的 RAII 容器是个好主意。

P.P.P.P.P.S.您的示例程序泄漏了动态分配。这是避免裸拥有指针的原因之一。


So p is allocated on the STACK pointing to a block of memory (array) in the HEAP where each element points (is a pointer) to a literal in the DATA segment?

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

关于c++ - 带有文本的 char* 是否会像使用 malloc 一样自动保留内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57795435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com