关于string.data()的一点疑问

测试程序的时候发现一个问题。定义了string x,y后,如果是先cin>>x>>y再用字符指针char *ptr1,*ptr2分别指向x.data()和y.data()后,用strcmp(ptr1,ptr2)的结果总是预期中的结果(就是符合实际),但如果反过来如果先指向后再cin>>x>>y就会出现问题,一旦cin的x或y的字符比较多(超过20,事实上也算很少),strcmp就无法正确比较字符串了。请问是什么原因呢?谢谢解答!
2026年09月25日 23:46
有1个网友回答
网友(1):

1 string::data()所返回的指针不应该被“长期”使用,因为对string的操作可能导致string重新分配字符内存。比如说,当输入字符数>20超过其默认分配的内存空间时,string有可能重新申请新的足够存放所有字符的内存空间,使得string::data()原来返回的内存地址失效。

2 string::data()返回的指针指向的字符串不是c语言风格的字符串,即它不一定以'\0'结束,因此使用strcmp等处理c风格字符串的函数对string::data()的返回值进行处理时有可能出错。即使先cin>>x>>y再取指针也存在出错的可能。正确的做法是使用string::c_str()函数。