2015-02-21 2 views
1

Я новичок в c и попытался написать простую функцию обратного преобразования.ошибка шины: 10 при попытке изменить строку в c

Вот мой код, который я получил в Интернете, составленный в порядке, но поднять «ошибка шины: 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 

Я думаю, что проблема заключается в «* конец = * начать», но я не знаю, почему? Вы можете мне помочь? Благодаря!

+2

Попробуйте 'char begin [] =" abc ";' – WhozCraig

+0

Первая проблема заключается в том, что опубликованный код не скомпилирован. в функции: str_reverse() есть неиспользуемая переменная: temp2 – user3629249

+0

в главном (0 переменная 'new' конфликтует с зарезервированным словом 'new в C++, поэтому, если вы используете компилятор C++, ваш код пытается переопределить зарезервированное слово – user3629249

ответ

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; 
} 
+0

Спасибо, @DrC !!!!!!!!!!!!! – lMolly

Смежные вопросы