C++ c_str()方法从字符串类返回什么?
我想访问string类维护的数组的起始地址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 str="hey";
char* pointer=(char*)str.c_str();
您可以通过
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实现中(可能在任何其他非疯狂的实现中)可以。但标准本身说,任何字符串修改都可能使指针失效,所以从技术上讲,若你们想写正确的东西(