总线错误:10时尝试在c中反转字符串

时间:2015-02-21 03:11:36

标签: c arrays pointers

我是c的新手并尝试编写一个简单的str反向函数。

这是我上网的代码,编译好了,但运行时提出“总线错误:10”。(请忽略这么多printf,我试图弄清楚每一步)

#include <stdlib.h>
#include <stdio.h>

char *str_reverse( char *begin, char *end ) {
    char *res;
    char temp;
    char temp2;
    res = begin;
    printf("str %s %s\n", begin,end);
    printf("res add %p begin add %p, end add %p\n", res, begin, end);
    while (end > begin) {
        printf("start\n");
        temp = *end;
        printf("temp %c\n",temp);
        *end = *begin;
        printf("end addr %p\n",end);
        end--;
        *begin = temp;
        printf("result %s\n", res);
        begin++;
    }
    printf("result %s\n", res);
    return res;
}

int main() {
    char *begin = "abc";
    char *end;
    end= begin + 2;
    char *new = str_reverse(begin, end);
    printf("value %s\n", new);
    return 0;
}

结果是:

str abc c
res add 0x1082fdf86 begin add 0x1082fdf86, end add 0x1082fdf88
start
temp c
Bus error: 10

我猜问题出在“* end = * begin”,但我不知道为什么?你能帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:2)

您正在尝试反转常量字符串。作为常量,它存储在不允许写入的段中。相反,分配一个可写缓冲区(数组),将字符串复制到它,然后应用你的函数。

int main() {
   char *str = "abc";
   char *begin = malloc(strlen(str)+1);
   if (!begin) {
       /* handle error*/
   }
   strcpy(begin, str);
   char *end;
   end= begin + 2;
   char *new = str_reverse(begin, end);
   printf("value %s\n", new);
   free(begin);
   return 0;
}