You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针反转字符串触发Bus Error的原因咨询

指针反转字符串触发Bus Error的原因及解决方法

问题场景

尝试通过指针实现字符串反转功能时,在string_reverse函数的*start = *end;赋值语句处触发Bus Error,调试确认错误发生在该内存写入操作环节。

完整代码如下:

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

void string_reverse(char* str)
{
    int len = strlen(str);
    char temp;
    char *end = str;
    char *start = str;

    /* 将end指针移动到最后一个字符 */
    for (int j = 0; j < len-1; j++)
    {
        end++;
    }

    for(int i = 0; i< len/2;i++ )
    {
        temp = *start;
        *start = *end;
        *end = temp;

        /* 更新指针位置 */
        start++;
        end--;
    }
    
}

int main( void ) 
{
    char *str = "test string";
    
    printf("Original string is %s\n", str);
    string_reverse(str);
    printf("Reverse string is %s\n", str);
    return 0;
}
  • 实际结果:执行到*start = *end;时触发Bus Error
  • 预期输出:
Reverse string is gnirts tset

错误根源

核心问题在于字符串的存储类型:

  • "test string"是字符串字面量,这类数据默认存储在程序的只读数据段(.rodata)中,操作系统会对该区域做写保护,禁止任何修改操作。
  • 代码中用char* str指向了这个只读字面量,当string_reverse函数尝试通过指针修改内存内容时,违反了只读内存的访问权限,直接触发Bus Error。

修复方案

将字符串定义为可修改的字符数组,而非指向只读字面量的指针:

// 替换原main函数中的char *str = "test string";
char str[] = "test string";

此时字符串会被分配在栈内存中,属于可读写区域,反转函数的内存修改操作就能正常执行,最终得到预期的反转结果。

内容的提问来源于stack exchange,提问作者J.p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:01:03