Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c_str()方法从字符串类返回什么?_C++ - Fatal编程技术网

C++ c_str()方法从字符串类返回什么?

C++ c_str()方法从字符串类返回什么?,c++,C++,我想访问string类维护的数组的起始地址 string str="hey"; char* pointer=(char*)str.c_str(); 指针是否指向数组的地址(由string类维护)?或者string类将从动态内存创建一个新数组,并将现有字符串复制到其中并返回其地址 如果这不是正确的方法,那么如何访问string类维护的数组的起始地址 您可以通过char*address=&str[0]获取字符串开头的地址。无需将字符串转换为c字符串表示形式。在c++11中,指针返回指向字符串对象当

我想访问string类维护的数组的起始地址

string str="hey";
char* pointer=(char*)str.c_str();
  • 指针是否指向数组的地址(由string类维护)?或者string类将从动态内存创建一个新数组,并将现有字符串复制到其中并返回其地址

  • 如果这不是正确的方法,那么如何访问string类维护的数组的起始地址


  • 您可以通过
    char*address=&str[0]获取字符串开头的地址。无需将字符串转换为c字符串表示形式。

    在c++11中,指针返回指向字符串对象当前用于存储符合其值的字符的内部数组


    有关更多详细信息,请参阅。

    注意:我的答案仅适用于。对于C++11,这是正确的答案


  • 它返回一个以null结尾的C字符串
    std::string
    本身不是以null结尾的,因此允许实现(并且可能会)返回新分配的
    const char
    数组。如果创建的
    std::string
    超出范围或发生变异,则返回的
    c_str()
    字符串将无效

  • data()
    返回数据,但注意它不是以null结尾的字符串

  • 在这两种情况下,都不应该调整数据,
    data()
    c_str()
    返回指向
    const char
    的指针,而实际上不应该

    例如,
    std::string
    s被允许是引用计数字符串(尽管这已不再常见),或者甚至可以对其数据使用时髦的索引方案(尽管从未见过这种情况)。

    如果您确实想要字符串中的“数据”,那么这就是您正在寻找的函数

    但是请注意,与
    c_str()
    一样,它是指向数据的
    const
    指针-您不应该修改此数据

    在C++11标准中,明确规定
    .C_str()
    (以及更新的
    .data()
    )应返回指向内部缓冲区的指针,该缓冲区由
    std::string
    使用

    通过
    .c_str()
    获取指针后对std::string的任何修改都可能导致返回的
    char*
    无效(即-如果
    std::string
    内部必须重新分配空间)

    在以前的C++标准中,允许实现任何返回。但作为标准,不要求用户取消分配结果,我从未见过任何实现返回任何新分配的内容。至少GNU gcc和MSVC++的STL字符串是内部以零结尾的字符数组,由

    c_str()
    返回

    这样,在任何实现的C++版本中,假设(C++的警告正常)是安全的。CyScript()/Cyr>将返回内部缓冲区。 换句话说,您永远不应该保留

    .c_str()
    的值,除非您100%确定它在将来任何时候都不会改变它的大小(除非它是
    常量)


    顺便说一句,你永远不应该做
    char*pointer=(char*)str.c_str()。它是
    const char*
    ,您不应该修改内容,部分原因是上面提到的-您可能会覆盖其他对象的内存,或者破坏
    std::string的内部状态,以防实现做一些花哨的事情,比如为更快的
    编制字符索引。find()
    (我看到了,但嘿,这是一个封装!)

    为什么要使用此地址?您想对字符串做什么?您是在寻找C++11答案还是C++03答案?正确答案取决于此。如果没有进一步的说明,我将进一步假设为C++11。也许您可以回答问题,以便我们更好地回答您的问题?您几分钟前就到过这里。@trojanfoe实际上我需要找到数据包的crc。计算它的函数是用c写的。它需要数据包的起始地址。我使用一个字符串对象作为数据包。所以我需要它的起始地址,这样我就可以把它传递给那个函数,完成我的工作。@phresnel我真的很抱歉,先生。我甚至不知道我使用的是什么版本。我只是在工作。有没有API或实用程序可以告诉我当前的版本,这样我也可以告诉你。@PeterWood没有,这不是必需的。@davmac我已经用过很多次了。你能给出一些理由吗,因为我想不出任何理由。@Aman Deep Gautam:因为标准没有强制要求。在许多实现中,它可能会工作,或者看起来会工作,但我不认为它能保证工作。@davmac我认为它确实能按照当前的标准工作。@AmandepGautam:“我已经使用过很多次了”在C++中,它并不是一个有效的参数,它的大量实现和未定义行为。@ TrangJoFe我在答案中所说的链接:“String::数据和String::CySTR是同义词,返回相同的值。”“你的意思是说它错了吗?”Tr.ChanjFoE在C++ 11中可能会有所不同。至少是这么说的。同意;删除我的通讯。这正是我期待的答案。。。。当然,由于常量字符串在进程中的位置(即可能位于只读内存页上),修改常量字符串几乎肯定会遇到可怕的情况。@Andrian Nord,如果调整大小的概率为0,那么??我创建了一个新的字符串对象,并使用了resize(512)方法。512是我的应用程序中可能的最大字符串长度。现在,如果我使用c_str()来获取地址,然后在对象上使用append()方法,可以吗?至少在当前的GNU和Microsoft STL实现中(可能在任何其他非疯狂的实现中)可以。但标准本身说,任何字符串修改都可能使指针失效,所以从技术上讲,若你们想写正确的东西(