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

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

Восстановить пароль Регистрация
 
2e1773ce
6 / 6 / 0
Регистрация: 10.03.2013
Сообщений: 96
08.06.2013, 23:37     Указатель (нарушение прав доступа) #1
После того как заменяет символ выдает ошибку " нарушение прав доступа" (когда увеличиваю указатель).
Что не так? После замены символа строка меняет адрес?
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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Модератор
 Аватар для Catstail
21430 / 10215 / 1664
Регистрация: 12.02.2012
Сообщений: 17,087
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
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
09.06.2013, 04:53     Указатель (нарушение прав доступа) #7
Вообще нужно взять за правило писать такие вещи:
C++
1
const char * = ...;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2013, 09:57     Указатель (нарушение прав доступа)
Еще ссылки по теме:

Нарушение прав доступа к виртуальной функции C++
C++ Ошибка: нарушение прав доступа по адресу
C++ Нарушение прав доступа

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

Или воспользуйтесь поиском по форуму:
Catstail
Модератор
 Аватар для Catstail
21430 / 10215 / 1664
Регистрация: 12.02.2012
Сообщений: 17,087
09.06.2013, 09:57     Указатель (нарушение прав доступа) #8
Croessmah, да, конечно - это указатель на константу. Виноват.
Yandex
Объявления
09.06.2013, 09:57     Указатель (нарушение прав доступа)
Ответ Создать тему
Опции темы

Текущее время: 18:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru