简单C程序中的总线错误

简单C程序中的总线错误,c,C,我正在尝试使用下面的简单程序反转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){

我正在尝试使用下面的简单程序反转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;

            }
    }
}
#包括“stdio.h”
无效反向(char*str);
int main(int argc,char*argv[]){
char*str=“你好”;
反向(str);
返回0;
}
无效反向(字符*str)
{
char*end=str;
char-tmp;
如果(str){
while(*结束){
++结束;
}
--结束;
while(str

当我试图运行上述程序时,我不明白为什么会出现“总线错误”。我使用的是i686-apple-darwin10-gcc-4.2.1。谢谢

C中的字符串文本存储在二进制文件的.data部分,该部分是只读存储器。当将其保存为
const char*
char*
时,它们是不可修改的(在某些情况下,如果您修改访问时以静默方式失败,或者在您的情况下,由于它是ROM,所以会出现总线错误)


尝试使用
charstr[]=“hello”(我相信这应该行得通,但我可能错了)。

如果您更改
char*str=“hello”
字符str[]=“你好”错误将消失,因为字符串文本存储在内存的只读部分,试图修改
“hello”
可能会导致程序崩溃(在本例中就是这样)


str
声明为
char[]
将文本
“hello”
复制到一个非常量缓冲区中,您可以修改它的内容。

挑剔的角落:实际上,标准将它们定义为普通
char
数组,其修改会产生未定义的行为。C++标准更为明智,并将它们定义为“代码> const <代码> >代码> char < /Case>数组,尽管它们对于兼容性的原因有一个隐式转换为“代码> char */CODE”。字符串文字不是“代码> const char */CODE >类型,它们属于<代码>数组n<代码> <代码> char < />(而不是
常量字符的
数组N
)谢谢!我把C++规则与C混淆了。你的命名错误了。虽然这是具体实现,传统上是代码>。数据< /代码>是读写的。它是代码>文本>代码>。只读的现代实现把代码< >代码> >代码> >代码> >文本>代码>也可以是不可执行的。@R..我没想到会有人真的在这件事上骂我。我想我的懒惰让我抓狂了:P