我正在尝试使用以下简单程序来反转C样式字符串。
#include "stdio.h"
void reverse (char * str);
int main (int argc , char* argv[]){
char *str = "hello";
reverse(str);
return 0;
}
void reverse (char *str)
{
char *end = str;
char tmp;
if(str){
while(*end){
++end;
}
--end;
while(str < end){
tmp = *str;
*str++ = *end;
*end-- = tmp;
}
}
}
当我尝试运行上述程序时,我无法弄清楚为什么会出现“总线错误”。我使用的是i686-apple-darwin10-gcc-4.2.1。感谢
答案 0 :(得分:4)
C中的字符串文字存储在二进制文件的.data部分中,该部分是只读存储器。将其保存为const char *
或char *
时,它们是不可修改的(在某些情况下,如果您修改访问权限会无声地失败,或者在您的情况下,您会收到总线错误,因为它是ROM)。
尝试使用char str[] = "hello";
代替(我相信这应该有用,但我可能错了)。
答案 1 :(得分:4)
如果您将char *str = "hello";
更改为char str[] = "hello";
,您的错误就会消失,因为字符串文字存储在内存的只读部分,并且尝试修改"hello"
可能会导致您的程序崩溃(就像在这种情况下一样)。
将str
声明为char[]
会将文字"hello"
复制到非常量缓冲区中,您可以修改其内容。