使用指针反转字符串触发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
相关产品推荐
相关产品推荐

