字符*的分割错误

Segmentation fault with char *

本文关键字:错误 分割 字符      更新时间:2023-10-16

我使用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;
}
char* cstr = "Kaboom";

在本例中,字符串字面值"Kaboom"具有数组类型。它被转换为指向字符串字面量中的第一个字符的指针,并且该指针存储在cstr中。但是,不能修改字符串字面值。实际上,您至少应该看到上面一行的警告。它应该是const char*

char cstr[] = "Kaboom";

这实际上是数组初始化的一个特殊情况。当您使用字符串字面值初始化数组时,它会将字符串字面值的每个元素复制到您的数组对象中。这样你就有了你自己可修改的字符串副本