在c 中反转一个字符串

我试图扭转一个字符串到位。

void reverseStr(char *str) { int i; int length; int last_pos; length = strlen(str); last_pos = length-1; for(i = 0; i < length / 2; i++) { char tmp = str[i]; str[i] = str[last_pos - i]; str[last_pos - i] = tmp; } } Program received signal SIGSEGV, Segmentation fault. 0x0000000000400893 in reverseStr (str=0x400974 "Haus") at main.c:102 102 str[i] = str[last_pos - i]; (gdb) print i $1 = 0 (gdb) print last_pos $2 = 3 (gdb) print str $3 = 0x400974 "Haus" (gdb) print str[3] $4 = 115 's' 

谢谢你的阅读。 我不明白,这个指令怎么会导致错误? 问候 :)

reverseStr的代码很好,问题出在调用代码中。 您几乎肯定会将字符串文字或其他只读内存传递给该函数。

您的调用代码最有可能是:

 char *str = "my string";//str points to a literal which cannot be modified reverseStr(str); 

但是你需要传递可写内存。 像这样:

 char str[] = "my string"; reverseStr(str); 

您正在将字符串文字传递给您的函数。 字符串文字在C中是不可修改的。

 char *p = "this string is non modifiable"; reverseStr(p); // undefined behavior 

使用由字符串初始化的数组:

 char p[] = "this string is modifiable"; reverseStr(p); // OK 

这取决于你如何调用此函数。

  • 如果你传递一个字符串常量的地址(类型{char * str =“String”}的定义被称为字符串常量。将Ans字符串常量放入可执行文件中的.rodata部分),那么你将收到exception。
  • 如果你传递一个数组的地址,(char arr [] =“String”),那么该函数将起作用。