2011-01-24 130 views
0

我想学习C的基础知识,但我无法弄清楚为什么这段代码不起作用。 reverse()中的while循环会导致总线错误。我在编程面试书中发现了几乎完全相同的代码作为一个有效的解决方案,但是这些或者其他类似的方法我都没有在这里发布过,但没有发生总线错误。In-Place String Reverse in C

#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; 
} 
+1

见http://stackoverflow.com/questions/4493139/are-string-literals-const等诸多问题(如至少每周一次)对SO。 – ephemient 2011-01-24 19:05:26

回答

4

问题是您正在尝试反转一个只读的常量字符串。将main中的a的声明更改为char a[] = "12";以使其成为可写的char数组而不是

+0

谢谢!这有很大帮助。 – Tiki 2011-01-24 19:11:32

2

您正在尝试更改导致未定义行为的字符串文字。

变化

char* a = "12"; 

char a[] = "12"; 
+0

哇,非常感谢! – Tiki 2011-01-24 19:10:42

-2

因为endstr指向同一个内存位置 - >它们是同一对象的两个不同的名字。你能避免使用两个变量:

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; 
} 
+0

“对象”?这是C! (无论如何,`end`和`str`只指向几行代码的同一位置。) – ladenedge 2011-01-24 19:07:31