动态分配字符串文字
dynamically allocate string literal
我想知道是否可以动态分配字符串文字?
我知道你能做到
char * letter = new char('b');
但是是否可以分配这样的字符串文字
例如:
char * letter = new char("Hello");
不,不是因为你写的时候
char * letter = new char("Hello");
您声明了一个指向字符串的指针,但为其分配了一个常量 char 值,这是不可能的。
你可以而且应该做的是使用 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");
但这仅适用于 文字 字符串,例如 "Hello"
并且您应该使用 same 文字字符串 "Hello"
两次(或使用 strlen("Hello")+1
而不是 sizeof("Hello")
,这是 6,因为终止零字节)。
请注意,在所有情况下,您都不会动态分配字符串文字。允许编译器(并且经常这样做)将文字字符串放入只读 code segment of the produced binary executable 中。您可以做的是在堆中分配一个内存区域,其中填充了该文字字符串的 copy(或使用 pointer const char* pc = "hello";
)
您可以永不分配文字,动态或其他方式。文字就是文字;根据定义,它们是内置的。
您当然可以动态分配 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");
它是专门为解决这类问题而发明的。
这样试试
int size = 6;
char * letter = new char[size];
strcpy(letter, "Hello");
std::cout << letter;
delete[] letter;
但请记住删除您的变量,因为在此示例中,您的变量 'letter' 在 'heap'
中分配
我想知道是否可以动态分配字符串文字?
我知道你能做到
char * letter = new char('b');
但是是否可以分配这样的字符串文字
例如:
char * letter = new char("Hello");
不,不是因为你写的时候
char * letter = new char("Hello");
您声明了一个指向字符串的指针,但为其分配了一个常量 char 值,这是不可能的。
你可以而且应该做的是使用 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");
但这仅适用于 文字 字符串,例如 "Hello"
并且您应该使用 same 文字字符串 "Hello"
两次(或使用 strlen("Hello")+1
而不是 sizeof("Hello")
,这是 6,因为终止零字节)。
请注意,在所有情况下,您都不会动态分配字符串文字。允许编译器(并且经常这样做)将文字字符串放入只读 code segment of the produced binary executable 中。您可以做的是在堆中分配一个内存区域,其中填充了该文字字符串的 copy(或使用 pointer const char* pc = "hello";
)
您可以永不分配文字,动态或其他方式。文字就是文字;根据定义,它们是内置的。
您当然可以动态分配 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");
它是专门为解决这类问题而发明的。
这样试试
int size = 6;
char * letter = new char[size];
strcpy(letter, "Hello");
std::cout << letter;
delete[] letter;
但请记住删除您的变量,因为在此示例中,您的变量 'letter' 在 'heap'
中分配