【问题标题】:dynamically allocate string literal动态分配字符串文字
【发布时间】:2015-03-03 10:05:51
【问题描述】:

我想知道是否可以动态分配字符串文字?

我知道你能做到

char * letter = new char('b');

但是是否可以分配这样的字符串文字

例如:

char * letter = new char("Hello");

【问题讨论】:

  • 你要的是什么编程语言?
  • 您可以将只读字符串 strncpy 到一个新的动态分配的字符串缓冲区中吗?
  • 之前有人问过这个问题。 [1]:stackoverflow.com/questions/27707631/…
  • @HoangMinh:很明显不同。这个 OP 正在使用new;另一种是使用现代 C++ 特性。
  • @LightnessRacesinOrbit:你是对的。我很快就做出了判断。谢谢

标签: c++ dynamic dynamic-arrays


【解决方案1】:

您可以从不动态或以其他方式分配文字。字面量是字面量;根据定义,它们是烘焙的。

您当然可以动态分配char从文字初始化它,就像您在示例中所做的那样。

不过,至于您的问题,从字符串文字初始化有点棘手,因为您只能使用正常的初始化语法从字符串文字初始化中获得自己的 char[N]

char[] str = "hello";  // special rules apply here

并且无法初始化动态分配的数组。在new[] 语法中无法做到这一点。


您可以动态分配指向字符串文字的指针:

const char** s = new const char*("hello");

但这完全没用。


我认为你能得到的最接近的是:

char* str = new char[5]{'h','e','l','l','o'};

但是,老实说,只需使用 std::string 代替:

std::string str("hello");

它是专门为解决这类问题而发明的。

【讨论】:

    【解决方案2】:

    你可以并且应该做的是使用std::string 并从像这样的文字初始化它

     std::string mystring{"Hello"};
    

    当你这样做时,mystring 被分配到堆栈上,其内容从 "Hello" 初始化(可能通过复制它,但请阅读小字符串优化或短字符串优化)。

    当该字符串被销毁时(例如,在包含块的末尾),它的存储空间(可能还有内部副本,如果有的话)将被释放。

    如果你坚持有一个指向堆分配的 C 字符串的指针,你可以使用strdup(然后用free 释放它,而不是delete);如果你想要一个 char 的原始数组,你可以使用

     char* p = new char[sizeof("Hello")]; // or new char[6]
     strcpy(p,"Hello");
    

    但这仅适用于 literal 字符串,如 "Hello",您应该使用 same 文字字符串 "Hello" 两次(或使用 strlen("Hello")+1 而不是 @987654335 @,即 6,因为终止零字节)。

    请注意,在所有情况下,您永远不会动态分配字符串文字。允许编译器(并且经常这样做)将文字字符串放入生成的二进制文件executable 的只读code segment 中。您可以做的是在堆中分配一个内存区域,其中填充了该文字字符串的 copy(或使用 pointer const char* pc = "hello";

    【讨论】:

      【解决方案3】:

      这样试试

      int size = 6;
      char * letter = new char[size];
      
      strcpy(letter, "Hello");
      std::cout << letter;
      
      delete[] letter;
      

      但请记住删除您的变量,因为在此示例中,您的变量“字母”分配在“堆”中

      【讨论】:

      • 除非是 2015 年,而且我们已经多年没有使用原始的 new[]delete[]auto letters(std::make_unique&lt;char[]&gt;(6)); 会更好。或者,你知道,std::string...
      • 我知道!问题不是关于 std::string
      • 嗯,问题是关于动态分配字符串。那std::string。你在这里所做的是教授过时和危险的方法。不负责任!
      • 我不这么认为。也许这很危险,但基本方法在 C++ 中很重要!
      • newdelete 不是“基本方法”。它们是先进的专家工具。
      【解决方案4】:

      不是因为你在写的时候

      char * letter = new char("Hello");

      您声明了一个指向字符串的指针,但为其分配了一个不可能的常量 char 值。

      【讨论】:

      • 这不是真的。实际上,这是荒谬/毫无意义的。
      • @TheParamagneticCroissant: error: invalid conversion from 'const char*' to 'char'
      猜你喜欢
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2020-12-09
      • 2020-07-05
      • 2018-04-07
      • 2020-10-09
      相关资源
      最近更新 更多