总线错误排查

2023-11-25

我正在尝试反转字符串。

这是我尝试过的代码:

#include<stdio.h>
#include<string.h>

int main(){
    char *c="I am a good boy";
    printf("\n The input string is : %s\n",c);
    printf("\n The length of the string is : %d\n",strlen(c));
    int i,j;
    char temp;
    int len=strlen(c);
    for(i=0,j=len-1;i<=j;i++,j--)
    {
            temp=c[i];
            c[i]=c[j];
            c[j]=temp;
    //printf("%c\t%c\n",*(c+i),*(c+(len-i-1)));
    }
    printf("\n reversed string is : %s\n\n",c);
}

该代码输出一个Bus error : 10.

但如果我重写相同的代码:

int main(void)
{
    char *str;
    str="I am a good boy";
    int i,j;
    char temp;
    int len=strlen(str);
    char *ptr=NULL;
    ptr=malloc(sizeof(char)*(len));
    ptr=strcpy(ptr,str);
    for (i=0, j=len-1; i<=j; i++, j--)
    {
        temp=ptr[i];
        ptr[i]=ptr[j];
        ptr[j]=temp;
    }
    printf("The reverse of the string is : %s\n",ptr);
}

它工作得很好。

为什么第一个代码会抛出总线错误或分段错误?


发生总线错误是因为在许多(如果不是大多数或所有现代)C 编译器中,字符串文字被分配在只读内存中。

您正在将字符串反转到位。在您的第一个代码片段中,您尝试写入字符串文字。这不是一个好主意。

在第二种情况下,您分配了一个字符串并将其放在堆上。现在可以安全地反转该字符串。

ADDENDUM

对于询问段错误与总线错误的评论者来说,这是一个很好的问题。我都见过。这是 Mac 上的总线错误:

$ cat bus.c 
char* s = "abc"; int main() {s[0]='d'; return 0;}

$ gcc --version bus.c && ./a.out
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Bus error

在其他操作系统/编译器上,您可能确实会遇到段错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

总线错误排查 的相关文章

随机推荐

  • AWS 上的 Kubernetes HTTP 到 HTTPS 重定向,使用 ELB 终止 SSL

    我正在尝试为流向 Kubernetes 集群的流量设置一个简单的 HTTP 到 HTTPS 重定向 SSL 终止发生在 ELB 上 当我尝试使用nginx ingress kubernetes io ssl redirect true它会导
  • CAS AD LDAP 32 错误

    当我尝试使用 CAS 登录时 我看到了这一点 CAS 通过 LDAP 对 AD 进行身份验证 SEVERE Servlet service for servlet cas threw exception javax naming NameN
  • 如何使用自定义键盘扩展插入 NSAttributedString?

    我想使用键盘扩展以一些自定义字体编写文本 因为这些应用程序 1 2 3 4 是做 我知道我们如何在文档代理中插入普通字符串 self textDocumentProxy insertText mystring 我尝试过插入NSAttribu
  • 清理 HTML 输入

    我正在考虑添加一个富文本编辑器 以允许非程序员更改文本的外观 然而 一个问题是 如果标记不正确 则可能会扭曲所呈现页面的布局 什么是清理 html 的轻量级好方法 您必须在优质和轻量级之间做出选择 推荐的选择是 HTMLPurifier 因
  • 使用 Discord.js 发送消息

    我正在尝试制作一个 Discord 机器人 但我不太理解 Discord js 我的代码如下所示 client on message function message if message content ping client messa
  • 如何在.net中检测麦克风的声音

    我目前有代码来创建位于可用空间中的网络摄像头 并根据我通过按键盘上的按键设置的标志自动向上或向下移动 我希望能够做到这一点 以便如果在麦克风上检测到声音 高于某个阈值 这样它就不会只是拾取噪音 那么该标志就会设置为 true 如果声音停止
  • 如何找出.NET 4中实体框架中的字段最大长度?

    根据this问题是 EF v1 中没有内置方法来计算字段的长度 有没有built in在 NET 4 附带的实体框架中执行此操作的方法 如果是这样 如何实现 EF 4 0 中没有新的方法来访问属性的长度 您仍然需要遍历元数据 如图所示在您引
  • 在 Python 2.6 中使用 unicode_literals 有什么问题吗?

    我们已经让我们的代码库在 Python 2 6 下运行 为了准备 Python 3 0 我们开始添加 from future import unicode literals 进入我们的 py文件 当我们修改它们时 我想知道是否还有其他人这样
  • R Shiny:单击按钮上传文件

    我知道网络上已经有很多材料可以回答我的问题 但似乎没有一个对我有用 我想那是因为我不太了解 Shiny 的响应式编程 因此 我希望创建一个界面 让用户使用以下命令选择文件fileInput只需单击 上传 按钮即可上传 我尝试了来自各个论坛的
  • 在 asp.net 中只能将 ScriptManager 的一个实例添加到页面中

    当我尝试添加用户控件时出现此错误 只能将 ScriptManager 的一个实例添加到页面中 Code ascx
  • web2py数据库中的表示格式

    db define table person Field name format name s 这个格式在这里有什么作用 The format参数用于确定如何显示引用 person 表的其他表中的字段 例如 如果您定义 db define
  • 字符串在 Java 源代码中何时何地初始化/存储?

    这是我的源代码 public class Koray public static void main String args System out println This is a sample program 当我编译它时 我得到了字节
  • 如何在node.js中实现登录验证

    我有这个节点服务器正在运行 var server http createServer function request responsehttp if request method POST var body request on data
  • 如何测试类型是否是匿名的? [复制]

    这个问题在这里已经有答案了 我有以下方法将对象序列化为 HTML 标记 我只想在类型不是匿名的情况下执行此操作 private void MergeTypeDataToTag object typeData if typeData null
  • 从映射驱动器或共享文件夹运行 .NET 程序

    我编写了一个 C Windows 窗体应用程序 用于将一台计算机上的远程文件夹 源 文件夹是映射驱动器 Z folder 中的文件和文件夹与另一台计算机上的另一个远程文件夹 目标 合并文件夹是共享文件夹的 UNC 路径 computerna
  • 为什么我们总是喜欢在SQL语句中使用参数?

    我对数据库工作非常陌生 现在我可以写了SELECT UPDATE DELETE and INSERT命令 但我见过很多论坛 我们更喜欢这样写 SELECT empSalary from employee where salary salar
  • 如何将文件从远程服务器中的目录 A 移动到目录 B?

    我正在使用 JSch 连接到由 GWT 制作的网站中的 SFTP 我读过一个小例子sftpChannel get sftpChannel rename sftpChannel rm 但我没有找到从远程服务器复制文件的解决方案a目录到远程服务
  • 无法在此事件处理程序中执行操作

    我正在尝试从 DataGridView 中删除一行我使用两种类型的指令 A VouchersDGV Rows Clear B If Not DGV Rows RowIndex IsNewRow Then DGV Rows RemoveAt
  • Matlab 中的高效分类

    我有一张尺寸为 RGB 的图像uint8 576 720 3 我想将每个像素分类为一组颜色 我已经使用rgb2lab从RGB空间到LAB空间 然后删除L层 所以现在是double 576 720 2 由AB组成 现在 我想将其分类为我在另一
  • 总线错误排查

    我正在尝试反转字符串 这是我尝试过的代码 include