连接时字符串"\0"为空时出错



,所以我试图连接简单的字符串,并做最后一句话。

int main()
{
    string I ("I");
    string Love ("Love");
    string STL ("STL,");
    string Str ("String.");
    string fullSentence = '';
    // Concatenate
    fullSentence = I + " " + Love + " " + STL + " " + Str;
    cout << fullSentence;
    return 0;
}

在这里,我不想没有什么都没有的"全境",所以我分配了null,这给了我一个错误。没有某些错误消息,除了我根本不理解的以下内容...

在练习_4.exe中以0x51C3F6E0(ucrtbased.dll)抛出例外:0xc0000005:访问违规读取位置0x00000000。发生

我立即删除' 0',它可以正常工作。为什么这样?

对我来说,它似乎是MSVC编译器错误。

语句:

string fullSentence = '';

不应该编译。


确实,从char(即'')到std::string没有有效的(隐式)构造函数。参考。


请注意,GCC和Clang不接受此代码作为有效。MSVC做。


为什么这样做?

查看汇编代码,MSVC使用以下构造函数编译该语句:

std::string::string(char const * const);

''作为参数传递,实际上将转换为nullptr

so:

用用null终止字符串的副本构建字符串,用s指向。字符串的长度由第一个零字符确定。如果[s,s 特征::长度(s))不是有效的范围(例如,如果s是null指针)。

因此您的代码是未定义的行为。

放置""而不是''。在C 中,''用于char,""用于字符串。

这是从char转换为非量表类型std::string

您可以使用调试器查看发生的情况。在这里查看字符节在您的情况下,下面调用了构造函数:

basic_string( const CharT* s, const Allocator& alloc = Allocator() );

根据构造函数的描述(强调地雷)构建 字符串,内容是用的初始化的内容的字符串 null终止的字符串用s指向。长度 字符串由第一个NULL字符确定。行为是 如果[s,s 特征::长度(s))不是有效的范围

,则不确定

在您的情况下,范围为空 ->无效。

相关内容

  • 没有找到相关文章

最新更新