Возможный дубликат:
Почему при записи в строку возникает ошибка сегментации?
У меня есть следующая программа:
#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, указывающее на, но что-то кажется ошибочным. Заранее благодарю за любую помощь!
Код выглядит хорошо для меня. Наиболее вероятная проблема заключается в том, что компилятору разрешено предполагать, что строковые литералы не изменены, поэтому он может поместить их в постоянную память. Пытаться
char s[] = "Hello";
в main()
вместо этого, который создает записываемая копия строкового литерала.
Альтернативное решение для @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
,
Заголовочный файл для strlen () отсутствует.
Во-вторых, выдается предупреждение — устарелое преобразование из строковой константы в char *, решение @ j_random_hacker, похоже, решает эту проблему.