указатели — C ++: обмен указанными переменными

Возможный дубликат:
Почему при записи в строку возникает ошибка сегментации?

У меня есть следующая программа:

#include <iostream>
using namespace std;

void reverseString(char* first, char* last)
{
while(first < last)
{
cout << *first << " " << *last << endl; //for debugging; prints 'H' and 'o' then crashes
char temp = *last;
*last = *first; //this line crashes the program
*first = temp;
first++;
last--;
}
}

int main()
{
char* s = "Hello";
reverseString(s, s + strlen(s) - 1);
cout << s << endl;
}

Однако у меня возникают проблемы при обмене значениями, на которые указывают указатели. Я думал, что * p = * p1 должен просто установить значение p, указывающее на, на значение p1, указывающее на, но что-то кажется ошибочным. Заранее благодарю за любую помощь!

4

Решение

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

char s[] = "Hello";

в main() вместо этого, который создает записываемая копия строкового литерала.

7

Другие решения

Альтернативное решение для @j_random_hacker:

char* buffer = new char[32];
strcpy(buffer, "Hello");
reverseString(buffer, buffer + strlen(buffer) - 1);

... rest of your program ...

delete[] buffer;

Это правильно распределяет память для строки в стиле C, которая затем может быть изменена любой функцией. Конечно, вам нужно включить <string.h> заголовок для доступа strcpy а также strlen,

1

Заголовочный файл для strlen () отсутствует.

Во-вторых, выдается предупреждение — устарелое преобразование из строковой константы в char *, решение @ j_random_hacker, похоже, решает эту проблему.

0
По вопросам рекламы [email protected]