繁体   English   中英

简单C程序中的总线错误

[英]Bus error in a simple C program

我正在尝试使用以下简单程序来反转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。 谢谢

C中的字符串文字存储在二进制文件的.data部分中,该部分是只读存储器。 将它保存为const char *char *它们是不可修改的(在某些情况下,如果您修改访问权限会无提示地失败,或者在您的情况下,您会收到总线错误,因为它是ROM)。

尝试使用char str[] = "hello"; 相反(我相信这应该有用,但我可能错了)。

如果你改变char *str = "hello"; to char str[] = "hello"; 你的错误将消失,因为字符串文字存储在内存的只读部分,并且尝试修改"hello"可能会导致程序崩溃(就像在这种情况下一样)。

str声明为char[]会将文本"hello"复制到非const缓冲区中,您可以修改其内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM