Обратный строки в C решение segfaulting - PullRequest
5 голосов
/ 07 марта 2011

Я нашел следующее решение в C для обращения строки:

#include <stdio.h>

void reverse(char * head);

void main() {

  char * s = "sample text";
  reverse(s);
  printf("%s", s);
}

void reverse(char * head) {

  char * end = head;
  char tmp;

  if (!head || !(*head)) return;

  while(*end) ++end;

  --end;

  while (head < end) {
    tmp = *head;
    *head++ = *end;
    *end-- = tmp;
  }
}

Однако мое решение - это segfaulting. По данным GDB, следующая строка:

*head++ = *end;

Строка segfaults на первой итерации цикла while. конец указывает на последний символ строки "t", а заголовок указывает на начало строки. Так почему же это не работает?

Ответы [ 2 ]

32 голосов
/ 07 марта 2011

Изменение

char * s = "sample text";

Для

char s[] = "sample text";

«образец текста» - это строковый литерал, который может находиться в разделе только для чтения вашего адресного пространства. Использование синтаксиса массива гарантирует, что эта строка будет скопирована в стек, который доступен для записи.

11 голосов
/ 07 марта 2011

Ваш s указывает на строковый литерал:

char * s = "sample text";

В функции reverse вы пытаетесь изменить строковый литерал, что приводит к неопределенному поведению.

Чтобы исправить это, сделайте s массив символов:

char s[] = "sample text";
...