我使用char数组/指针进行就地字符串反转算法。
为什么(1)
会给出细分错误,而(2)
能够完美运作?
#include <iostream>
#include <cstring>
using namespace std;
//In-place string reversal
void ip_reverse(char* cstr)
{
int len = strlen(cstr);
int hlen = len/2;
char ctmp;
for(int i=0; i<hlen; i++)
{
ctmp = cstr[i];
cstr[i] = cstr[(len-1)-i];
cstr[(len-1)-i] = ctmp;
}
}
int main()
{
//char* cstr = "Kaboom"; //(1)This gives "Segmentation fault"!
char cstr[] = "Kaboom"; //(2)This works!
cout << "Original string => " << cstr << endl;
ip_reverse(cstr);
cout << "Reversed string => " << cstr << endl;
return 0;
}
答案 0 :(得分:4)
char* cstr = "Kaboom";
在这种情况下,字符串文字"Kaboom"
具有数组类型。它将转换为指向字符串文字中第一个字符的指针,该指针存储在cstr
中。但是,不能修改字符串文字。事实上,您应该至少看到上述行的警告。它应该是const char*
。
char cstr[] = "Kaboom";
这实际上是数组初始化的一个特例。使用字符串文字初始化数组时,它会将字符串文字的每个元素复制到数组对象中。那么你就有了自己可以修改的字符串副本。