Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
2e1773ce
6 / 6 / 0
Регистрация: 10.03.2013
Сообщений: 96
#1

Указатель (нарушение прав доступа) - C++

08.06.2013, 23:37. Просмотров 465. Ответов 7
Метки нет (Все метки)

После того как заменяет символ выдает ошибку " нарушение прав доступа" (когда увеличиваю указатель).
Что не так? После замены символа строка меняет адрес?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
void replace(char *s,char from , char to)
{
    if(*s == '\0')
    {
        //std::cout << *s << std::endl;
        return;
    }
    if(*s == from)
        *s = to;
    replace(++s , from ,to);
}
 
int main(int argc, char *argv[])
{
    char *str = "hello world!";
    replace(str , 'r' , '_');
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2013, 23:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель (нарушение прав доступа) (C++):

Указатель на указатель и Нарушение прав доступа - C++
функция, добавляющая новый элемент в динамический массив из указателей При вызове : pData=Add(NULL,1,question); Работает исправно,...

Указатель на структуру (нарушение прав доступа) - C++
Здравствуйте. Подскажите пожалуйста. struct e2 { int field; } e1; struct v2 { int field;

Нарушение прав доступа при записи. Висящий указатель нашел, но не знаю как исправить ситуацию - C++
Здравствуйте! Имеется программа поиска коллизий в хэш-функции #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define n 30 //размер...

Нарушение прав доступа - C++
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения. //get - seletor, set - modificator, show - вывод ...

Нарушение прав доступа - C++
Выдает вот это Необработанное исключение в &quot;0x000d1e05&quot; в &quot;зпр3.exe&quot;: 0xC0000005: Нарушение прав доступа при чтении &quot;0xfdfdfe05&quot;. ...

Ошибка: Нарушение прав доступа - C++
Здравствуйте, пишу программу для минимизации канонических выражений (сумм минтермов). Проблема такая - всё компилируется, а при...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Dr_Quake
Заблокирован
08.06.2013, 23:42 #2
Так ты в коде указатель и меняешь, а не сам char.
2e1773ce
6 / 6 / 0
Регистрация: 10.03.2013
Сообщений: 96
08.06.2013, 23:43  [ТС] #3
ps: функция рекурсивно заменяет(должна) "from" символы на "to".
Catstail
Модератор
22537 / 10942 / 1774
Регистрация: 12.02.2012
Сообщений: 18,080
08.06.2013, 23:49 #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Конструкция

C++
1
char *str = "hello world!"
означает, что str - константный указатель. Его менять нельзя - отсюда и ошибка. Но если сделать так:

C++
1
2
3
char str1[20];
char *str = "hello world!"  
   strcpy(str1,str);
то str1 менять допустимо.

Добавлено через 5 минут
А вот и код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream.h>
#include <string.h>
 
void replace(char *s,char from , char to)
{
    if(*s == '\0')
    {
        //std::cout << *s << std::endl;
        return;
    }
    if(*s == from)
        *s = to;
    replace(++s , from ,to);
}
 
int main(int argc, char *argv[])
{
    char *str = "hello world!";
    char str1[20];
    strcpy(str1,str);
    replace(str1 , 'r' , '_');
    cout << str1 << endl;
    return 0;
}
Croessmah
08.06.2013, 23:50
  #5

Не по теме:

Catstail, Позволю себе Вас поправить.
str - указатель на константу, а не константный указатель.

castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
09.06.2013, 00:04 #6
Цитата Сообщение от Catstail Посмотреть сообщение
означает, что str - константный указатель. Его менять нельзя - отсюда и ошибка.
Правильней будет сказать что str - это указатель на константу. Хоть он и не объявлен с модификатором const, но сама строка находится в .rdata, т.е. там куда писать нельзя.
Объявление переменной как массива символов решает эту проблему.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
void replace( char *s, char from , char to )
{
    if ( *s == '\0' ) return;
    if ( *s == from ) *s = to;
    replace( s + 1, from, to );
}
 
int main()
{
    char s[] = "Hello world!";
    replace( s, 'r', '_' );
    std::cout << s << std::endl;
    return 0;
}
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
09.06.2013, 04:53 #7
Вообще нужно взять за правило писать такие вещи:
C++
1
const char * = ...;
Catstail
Модератор
22537 / 10942 / 1774
Регистрация: 12.02.2012
Сообщений: 18,080
09.06.2013, 09:57 #8
Croessmah, да, конечно - это указатель на константу. Виноват.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2013, 09:57
Привет! Вот еще темы с ответами:

Нарушение прав доступа при записи - C++
Привет всем! Извините за тупизм но у меня проблема. #include &lt;iostream&gt; using namespace std; void f(char* str) { int length =...

Нарушение прав доступа при чтении - C++
Здравствуйте,реквестирую помощь,я уже волосы на голове рву в попытке решить эту проблему,при чтении из бинарного файла выводит...

Нарушение прав доступа в странном месте - C++
Здравствуйте, пишу небольшую игру монополию на OpenGL, первая моя игра так что многое узнаю впервые... (только прошу не переносите тему в...

Нарушение прав доступа при чтении - C++
Имею функцию такого плана: void RenameOldLabels() { USES_CONVERSION; string path, pathAfterRename, pathToDelFile, pathToDelDir,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.06.2013, 09:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru