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

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

Войти
Регистрация
Восстановить пароль
 
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
#1

Неправильный указатель - C++

25.12.2013, 23:50. Просмотров 998. Ответов 5
Метки нет (Все метки)

Всем доброго времени суток. Возникла проблема со строками. Пытаюсь создать функцию которая будет удалять из строки все символы в заданном промежутке(она на удивление работает). Возник вопрос, когда я запустил ф-цию через отладчик то при создании указателя на новую строку в отладчике у меня появляется сообщение что создан неправильный указатель(как оказалось позже в функции мейн при создании строки тоже появляется такое сообщение), если не трудно подскажите почему указатель неправильный и как это исправить? вот код программы.
PS:В аналогичной функции для числового массива указатель содается правильно.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <conio.h>
#include <cstring>
#include <Windows.h>
 
using namespace std;
 
char *del(char s[],int begin, int end)//функция удаляет из строки символы от бегин до енд
{
    int size = strlen(s)+1;//подсчет размера строки + нулевой байт
    size-=(end-begin);//вычисление размера для нового массива
    char *str = new char[size];//создание нового массива
    int j = 0;//переменная для смещения символов
    str[size-1]='\0';//завершение строки нулевым байтом
    for(int i(0);i<size;i++)
    {
        if(i==begin)//если и = бегин то присвоить значение для j разницу между end и begin
            j = end - begin;
        str[i]=s[i+j];
    }
    cout<<str<<endl;
    delete []s;//удаление старого массива
    return str;//возвращение нового массива
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int size = 100;
    char *str = new char[size];// на отладчике появляется сообщение что str - это неправильный указатель, аналогично и в функции дел
    cout<<"Enter string:";
    cin.getline(str,size);
    int begin,end;
    cout<<"Enter begin:";
    (cin>>begin).get();
    cout<<"Enter end:";
    cin>>end;
    cout<<str<<endl;
    str = del(str,begin,end);
    delete [] str;
    _getch();
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2013, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неправильный указатель (C++):

Неправильный указатель string - C++
Простейший код с использование строки, пишет что неправильный указатель str в 7-й строке (при выполнении), подскажите в чем проблема. ...

Неправильный указатель при отладке - C++
Не совсем про C++ вопрос, скорее про IDE(прошу админов сильно не ругать - раздела про IDE не нашел), а именно VS 2015. При нажатии на...

Ошибка "Неправильный указатель" - C++
#include &lt;conio.h&gt; #include &quot;stdafx.h&quot; #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; ...

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 725
26.12.2013, 00:58 #2
если не трудно подскажите почему указатель неправильный и как это исправить?
исправить просто - никогда не юзать
C++
1
2
#include <conio.h>
#include <Windows.h>
а так же всякую фигню типа _getch();
также эту дребедень - str = del(str,begin,end);

и конечно
C++
1
2
3
4
  SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int size = 100;
    char *str = new char[size];// на отладчике появляется сообщение что str - это неправильный указатель, аналогично и в функции дел
показываю как решать это задачу в нормальном C++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
main()
{
 using namespace std;
 string str;
 size_t begin,end;
 cout<<"Enter String : ";
 cin>>str;
 cout<<"Enter begin : ";
 cin>>begin;
 cout<<"Enter end : ";
 cin>>end;
 str.erase (begin-1, (end-begin+1));
 cout<<"Reuslt : "<<str;
 cin.sync();
 cin.get();
}
0
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
26.12.2013, 15:54 #3
Цитата Сообщение от Hrollo Посмотреть сообщение
в отладчике у меня появляется сообщение что создан неправильный указатель
Напиши дословно, что там написано. В твоём коде ничего неправильного нет
0
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
26.12.2013, 20:13  [ТС] #4
str 0xcccccccc <Неправильный указатель> - это выскакивает при создании указателя
CXX0030: ошибка: невозможно вычислить выражение - это код ошибки
str 0x007e48a8 "ННННННННННННННННННННННээээ««««««««оюоюою" - это насколько я понял содержится в указателе
0
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
26.12.2013, 20:22 #5
Цитата Сообщение от Hrollo Посмотреть сообщение
str 0xcccccccc <Неправильный указатель> - это выскакивает при создании указателя
Что значит "выскакивает"? Ты ничего не делаешь и оно вдруг выскакивает? Или ты стоишь в отладчике на этой строке (str = new ..), просишь напечатать значение переменной и оно выскакивает? Если так, тот тут всё логично. Этот момент времени соответствует тому, когда значение ещё НЕ записано (т.е. ты стоишь на той точке, в которой операция ещё НЕ выполнилась)

Цитата Сообщение от Hrollo Посмотреть сообщение
str 0x007e48a8 "ННННННННННННННННННННННээээ««««««««оюоюою" - это насколько я понял содержится в указателе
Видимо, это уже после выполнения new. Память выделилась, но инициализирована мусором, т.к. ты туда ещё ничего не записал. Всё в порядке.

Другими словами, в программе у тебя всё правильно, ты просто немного не так работаешь с отладчиком, или немного не верно интерпретируешь его порывы облегчить тебе жизнь
1
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
26.12.2013, 20:40  [ТС] #6
Спасибо за объяснение. Я думал что это я чтото не так делаю
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2013, 20:40
Привет! Вот еще темы с ответами:

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Указатель на указатель, функции для создания новых массивов? - C++
Всем привет! У меня в коде есть несколько новых массивов, чтобы не повторяться я создам функцию которая будет выделять память под новые...

Объяснить работу функции, возвращающей указатель на указатель на char - C++
Добрый день! Сможете объяснить что означает запись char **InputFile(int &amp;strings);? Почему именно двойное **? Буду очень благодарна...


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

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

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