C中的就地字符串反转

我正在尝试学习C的基础知识,但我无法弄清楚为什么这段代码不起作用。 reverse()中的while循环导致总线错误。我在编程采访书中发现了几乎完全相同的代码作为有效的解决方案,但是我在这里发布的这个或其他类似方法都没有出现总线错误。
#include <stdio.h>

void reverse(char* str) {
 char* end = str;
 char tmp = 0;
 if(str) {
  while(*end) {
   end++;
  }
  --end;
  while(end>str) {
   tmp = *end;
   *end-- = *str;
   *str++ = tmp;
  }
 }
}

int main() {
 char* a = "12";
 puts(a);
 reverse(a);
 puts(a);

 return 0;
}
    
已邀请:
问题是你试图反转一个只读的常量文字字符串。将
main
的声明更改为
main
,使其成为可写char数组     
您正在尝试更改导致未定义行为的字符串文字。 更改
char* a = "12";
char a[] = "12";
    
因为
end
str
指向相同的内存位置 - >它们是同一对象的两个不同名称。您可以避免使用两个变量:
char foo[20] = "abcdefghi", tmp;
int counter = 0, length = strlen(foo);

for(counter, counter < length / 2; counter++) {
    tmp = foo[counter];
    foo[counter] = foo[length - counter];
    foo[length - counter] = tmp;
}
    

要回复问题请先登录注册