C: перевернуть строку на месте. Я использовал прогу, ответили на более ранний вопрос. Компилируется нормально но вылетает с ошибкой сегментации - PullRequest
1 голос
/ 21 февраля 2009

Я вызываю функцию, предоставленную Крисом Конвеем ( Как перевернуть строку на месте в C или C ++? ) из main (код C). Когда я запускаю эту программу, используя cygwin, программа падает, когда она находится в цикле while (комментирует строки, где она прерывается). Не могли бы вы объяснить, что здесь происходит не так. Спасибо

#include <stdio.h>
#include <string.h>

void strrev(char* z);

int main()
{
        char *a;
    printf("before reverse: %s\n", a);
        strrev(a); // function provided by Chris Conway
    printf("after reverse: %s\n", a);
    return 0;
}

void strrev(char *str) {
  char temp, *end_ptr;

  /* If str is NULL or empty, do nothing */
  if( str == NULL || !(*str) )
    return;

  end_ptr = str + strlen(str) - 1;

  /* Swap the chars */
  while( end_ptr > str ) {
    temp = *str;
    *str = *end_ptr;  //crashes here (cygwin gives segmentation fault)
    *end_ptr = temp;  //for testing, if I comment out line above, it crashes here
    str++;
    end_ptr--;
  }
}

1 Ответ

8 голосов
/ 21 февраля 2009

Функция в порядке, но ваш main() не отображается для инициализации строки a.

Попытка:

int main() {
  char a[1024];
  strcpy(a, "Some string");
  printf("before reverse: %s\n", a);
  strrev(a); // function provided by Chris Conway
  printf("after reverse: %s\n", a);
  return 0;
}

Обратите внимание, что я создаю копию "Some string" внутри a (вместо прямого присваивания char* a = "Some String"), потому что попытка изменить константу напрямую не будет компилироваться. И если вам удалось скомпилировать (например, слабый компилятор, или вы принудительно удалили константность с помощью cast / const_cast), то вы рискуете потерпеть крах вашей программы, потому что «Некоторая строка» фактически находится в той части памяти, которая читается -только в некоторых системах, поэтому копия должна быть сделана внутри локальной переменной (т. е. в стеке) или новой переменной (выделена с помощью new или malloc, т. е. в куче).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...