给一个字符串指针赋值

3

我目前正在分析字符和字符串数据类型。对于char数据类型,以下代码片段适用:

char value = 'a';
char value1[] = "Good";
char* value2 = "Good";

对于字符串,

string strValue = "Good";
string strVal[3] = {"Good","Better","Best"};

但是下面的任务会引发编译错误:
"error: scalar object strPtr requires one element in initializer"
string* strPtr = {"Good","Better","Best"}

那么,如何最初为上述的string*分配值呢?
谢谢, Udhai

4
由于语言设计上的错误,虽然允许这样做,但实际上不应该这样做,并已被弃用。字符串字面量驻留在只读内存中,在该语句中,您正在将一个非const指针分配给其中一个元素。因此,如果您尝试修改字符串,它将编译,但在运行时不起作用。这是不好的。char* value2 = "No good"; - Benjamin Lindley
指针指向一个地址,对吧?所以,当你“赋值”给一个指针时,你必须先对其进行解引用,这样才能实际处理指针指向的数据地址。尝试给未解引用的指针分配值相当于说你正在尝试更改你指向的数据的地址。你给string *赋值的是已经定义或至少声明了的string变量。 - ChiefTwoPencils
那个问题在此期间没有被修复吗?我以为现在(C++ 0x 或者标准的一个较晚版本)字符串字面常量总是具有 const char* 类型(这应该会导致编译错误)。 - Axel
值得一提的是,GCC标志“-Wwrite-strings”有助于调试Benjamin指出的问题。 - Marco Leogrande
string* strPtr = {"Good","Better","Best"} 的使用场景是什么?如果你声明为 string[],你可以将其赋值给 string*,所以通常不需要这样做。由于这种初始化方式将数组放在堆栈上(因此不能调用 delete[] 删除指针),稍后重新分配指针到通常在堆上分配的内容会带来麻烦。 - Axel
3个回答

3
指针不是数组,那你为什么还想假装它是呢?但你可以这样做:
string strVal[3] = {"Good","Better","Best"};
string* strPtr = strVal;

0
这样做有效:
std::string* strPtr{new std::string[3]{"Good","Better","Best"}};

这也可以编译

std::string* strPtr{(std::string[3]){"Good","Better","Best"}};

但绑定了指针到一个临时变量,所以请不要这样做。


在第一个示例中,您在堆上创建数组,而不是栈上,并且如果您不想让内存泄漏,必须手动删除。 - Axel
@Axel:这取决于生命周期...如果它是全局的,就没有必要释放它,因为全局变量应该一直存在直到程序结束。 - Ben Voigt

-1

我想你指的是 std::string

正确的方法是

std::string *s(new std::string);
// or
std::string *s = new std::string;

如果你想要一个指向字符串的指针

std::string s_arr[3] = {"Good","Better","Best"};
string* str_p = s_arr;

如果您想要一个指向字符串数组开头的指针。

你是不是缺少了一个 )?...(new std::string; - ChiefTwoPencils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接