下面的代码有什么问题

该代码被假设为旋转i位置左侧的n个元素的一维向量。 例如,当n = 8且i = 3时,矢量abcdefgh旋转到defghabc。

以下在string_reverse函数崩溃。 无法找出那里的错误。

#include  #include  #include  void string_reverse(char* str, int left, int right ) { char *p1 = str + left; char *p2 = str + right; while (p1 < p2) { char temp = *p1; *p1 = *p2; *p2 = temp; p1++; p2--; } } void rotate( char* str, int k ) { int n = strlen( str ); string_reverse( str, 0, k - 1 ); string_reverse( str, k, n - 1 ); string_reverse( str, 0, n -1 ); } int main(int argc, char* argv[]) { char* string = "abcdefghijk"; rotate( string, 3 ); printf("%s",string ); getch(); return 0; } it crashes at *p1 = *p2; 

更改

 char* string = "abcdefghijk"; 

 char string[] = "abcdefghijk" 

前者指向只读字符串文字,而后者是从该文字初始化的数组。

如果要使用字符串进行操作,请使用实际字符数组而不是字符指针。

  char string[] = "abcdefghijk"; 

内存分配为变量初始化程序,像这样……

 char* string = "abcdefghijk"; 

……是不可改变的。 也就是说,您无法更改它,尝试写入它将导致段错误。 您只能修改通过malloc()和朋友分配的malloc() 。 您可以使用这样的静态字符串轻松完成此操作:

 char *string = strdup("abcdefghijk"); 

strdup()函数在内部调用malloc() ,然后将源字符串复制到目标中。 你已经#include -ing string.h ,所以strdup()函数原型已经可用,没有任何额外的代码。