假设有一个返回固定“随机文本”字符串的函数,代码如下:
char *Function1()
{
return “Some text”;
}
如果程序意外尝试更改该值,则可能会导致程序崩溃。
Function1()[1]=’a’;
函数调用后面的方括号是什么意思?它们可能会导致程序崩溃吗?如果您对此熟悉,欢迎提供解释!
假设有一个返回固定“随机文本”字符串的函数,代码如下:
char *Function1()
{
return “Some text”;
}
如果程序意外尝试更改该值,则可能会导致程序崩溃。
Function1()[1]=’a’;
那个函数的签名应该是 const
char* Function();
。
std::string
,因为 OP 想要修改从函数返回的值。 - John Diblingconst char*
类型。有一个特殊的例外,可以将指向字符串常量的指针转换为char*
,从而去掉const
修饰符,但基础字符串仍然是常量。所以通过您正在做的事情,您正在尝试修改一个const
。这也会引发未定义的行为,并类似于尝试执行以下操作:const char* val = "hello";
char* modifyable_val = const_cast<char*>(val);
modifyable_val[1] = 'n'; // this evokes UB
不要从您的函数返回 const char*
,而是通过值返回一个 string
。这将根据字符串字面值构造一个新的 string
,调用代码可以任意操作:
#include <string>
std::string Function1()
{
return “Some text”;
}
稍后:
std::string s = Function1();
s[1] = 'a';
现在,如果你想改变Function()
返回的值,那么你需要做一些其他的事情。我会使用一个类:
#include <string>
class MyGizmo
{
public:
std::string str_;
MyGizmo() : str_("Some text") {};
};
int main()
{
MyGizmo gizmo;
gizmo.str_[1] = 'n';
}
你可以使用静态字符串作为返回值,但你从未使用过它。这就像访问冲突错误一样。在C++标准中,它的行为没有被定义。
问题不在于括号,而在于赋值。您的函数返回的不是简单的 char*,而是 const char*(尽管我可能说错了,但这里的内存是只读的),因此您试图更改不可更改的内存。而括号 - 它们只是让您访问数组元素。
char Function1Str[] = "Some text";
char *Function1()
{
return Function1Str;
}
char* pch = "Here is some text";
char* pch2 = "some text";
char* pch3 = "Here is";
现在,编译器如何为字符串分配内存完全是编译器的事情。内存可能会像这样组织:
Here is<NULL>Here is some text<NULL>
pch2指向pch字符串内存位置。
关键在于理解内存。使用标准模板库(STL)是一个好的实践,但对你来说可能会有相当陡峭的学习曲线。