下面的代码有什么问题
该代码被假设为旋转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()
函数原型已经可用,没有任何额外的代码。