C 交换字符数组的元素可以工作,但交换字符字符串的元素会导致核心转储

C 交换字符数组的元素可以工作,但交换字符字符串的元素会导致核心转储,c,arrays,string,C,Arrays,String,我试图执行如下程序所示的交换操作,但当我将元素b复制到a(swap()方法中的第3行)时,它似乎崩溃了-如果输入是字符字符串,即char*str;如果它是一个字符数组(如char str[];),交换操作可以正常工作 #include<stdio.h> void swap(char *a, char *b) { char tmp; tmp = *a; *a = *b; /* crash occurs here */ *b = tmp; } void f

我试图执行如下程序所示的交换操作,但当我将元素b复制到a(swap()方法中的第3行)时,它似乎崩溃了-如果输入是字符字符串,即char*str;如果它是一个字符数组(如char str[];),交换操作可以正常工作

#include<stdio.h>

void swap(char *a, char *b)
{
  char tmp;
  tmp = *a;
  *a = *b;       /* crash occurs here */
  *b = tmp;
}

void func(char *a)
{
  swap(a+1, a+2);
}

int main()
{
  char *str = "abc";

  // char str[] = "abc";   /* with this char array, the above swap func works */  

  func(str);
}
#包括
无效交换(字符*a,字符*b)
{
char-tmp;
tmp=*a;
*a=*b;/*此处发生崩溃*/
*b=tmp;
}
void func(字符*a)
{
互换(a+1、a+2);
}
int main()
{
char*str=“abc”;
//char str[]=“abc”;/*使用此字符数组,上述交换函数工作*/
func(str);
}
我认为这与一些我似乎不知道的C字符串规则有关。请帮忙

字符串文字是只读的,试图修改字符串文字会导致未定义的行为

最简单的解决方案?将其声明为数组:

char str[] = "abc";
上面将字符串放在程序的常量数据部分(也称为.rdata)。由于它被视为常量数据,因此无法修改

char str[] = "abc";
如上所述,将字符串放入程序的堆栈区域,如在函数范围内声明的。此数据可以修改

因为这是关于字符串数据的存储,所以在第一次声明中会出现崩溃。

'char*str=“abc”' 以上内容将abc置于只读存储器中。所以它不能被修改。
'字符str[]=“abc”;'被放置在堆栈中。所以它可以被修改。

是的。试试看char*str=strdup(“abc”)获取一个可变字符串。@MohammedRaqeeb记住,
strdup
分配您需要的内存来
释放
@感谢您指出这一点,刚刚浏览了strdup()的手册页,我们确实需要显式释放内存,因为它是在堆上分配的…谢谢。这是否意味着字符字符串(在.rdata节中分配的内存)将具有全局作用域(不确定它是全局还是静态),如果是这样的话。
char str[] = "abc";