char *的分段错误

时间:2014-07-02 10:28:29

标签: c++

我使用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;
}

1 个答案:

答案 0 :(得分:4)

char* cstr = "Kaboom";

在这种情况下,字符串文字"Kaboom"具有数组类型。它将转换为指向字符串文字中第一个字符的指针,该指针存储在cstr中。但是,不能修改字符串文字。事实上,您应该至少看到上述行的警告。它应该是const char*

char cstr[] = "Kaboom";

这实际上是数组初始化的一个特例。使用字符串文字初始化数组时,它会将字符串文字的每个元素复制到数组对象中。那么你就有了自己可以修改的字符串副本。