2015-01-09 6 views
1

Я пытаюсь написать простую программу на языке C, чтобы перевернуть строку. Код указан ниже:C программа неожиданно выходит из строя после предоставления правильного вывода

void swap(char* a, char* b){ 
    char* temp; 

    *temp = *a; 
    *a = *b; 
    *b = *temp; 
} 


char* reverseString(char* str){ 
    int length = strlen(str); 
    int i=0; 

    for(i=0; i<(length/2); i++){ 
      swap(&str[i], &str[length-i-1]); 
    } 

    return str; 
} 

int main(){ 
    char str[] = "Hello World"; 
    reverseString(str); 
    printf("%s\n",str); 

    return 0; 
} 

Он печатает правильный результат, но затем он выдает сообщение об отключении СЕГМЕНТАЦИИ. Это происходит в инструкции «return 0» основной функции.

Не могли бы вы помочь мне выяснить, почему происходит SEG FAULT.

Спасибо.

+3

'символ * Температура,' 'Шоуда быть символ температуры,' – BLUEPIXY

ответ

2

вы вызываете неопределенное поведение, поэтому код, кажется, работает, но это на самом деле не работает правильно, у вас есть проблема здесь

void swap(char* a, char* b) { 
    char *temp; 

    *temp = *a; 
    *a = *b; 
    *b = *temp; 
} 

вы объявленная temp как char указателя, а затем вы разыменование него в то время как это неверный указатель, правильный способ сделать это было бы

void swap(char* a, char* b) { 
    char temp; 

    temp = *a; 
    *a = *b; 
    *b = temp; 
} 

и вы можете сделать это слишком

void swap(char* a, char* b) { 
    char temp[1]; 

    *temp = *a; 
    *a = *b; 
    *b = *temp; 
} 

, который не имеет особого смысла, но будет работать, или вы даже можете сделать это, как этот

void swap(char* a, char* b) { 
    char *temp; 

    temp = malloc(1); 
    if (temp != NULL) 
    { 
     *temp = *a; 
     *a = *b; 
     *b = *temp; 

     free(temp); 
    } 
} 

, что делает способ менее оправданной, но и работает, дело в том, чтобы показать вам, что использовать оператор направления *, указатель должен быть действительным.

Таким образом, причиной отказа вашей программы было неопределенное поведение, вызванное недействительным разыменованием указателя.

7

В вашей swap() функции, спросите себя:

void swap(char* a, char* b){ 
    char* temp; 

Q: Где temp указывая прямо сейчас?
A: Неизвестно, возможно, где-то опасно.

*temp = *a; 

И все же мы просто что-то написали в этом месте.

Вместо этого используйте char в:

void swap(char* a, char* b){ 
    char temp; 

    temp = *a; 
    *a = *b; 
    *b = temp; 
} 
+1

Также стоит упомянуть, почему вы не видите проблему сразу: Код будет «работать», а также использовать некоторые неизвестные ячейки памяти для хранения вашего временные переменные. Однако, когда вы вернетесь, вы отдаете контроль над средой выполнения C, которая теперь имеет ваши символы, написанные над его адресным пространством.Я предполагаю, что вы перезаписали указатель, и среда выполнения пытается получить доступ за пределами своего адресного пространства. Вот почему вы видите ошибку только после завершения вашего кода. – TarkaDaal

0

В функции обмена, либо использовать Int темп;

void swap(char *a, char *b) 
{ 
    char temp; 
    temp = *a; 
    *a = *b; 
    *b = temp; 
} 

или установить int * temp = NULL, чтобы он не указывал на неизвестную память.

void swap(char *a, char *b) 
{ 
    char *temp = NULL; 
    *temp = *a; 
    *a = *b; 
    *b = *temp; 
} 
+0

Ваш второй пример подкачки приведет к сбою. Вы разыскиваете нулевой указатель, особенно в * temp = * a – cmidi

+0

Мой плохой. Я должен выделить память. Благодарю. – nitimalh

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