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

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

Восстановить пароль Регистрация
 
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
25.12.2013, 23:50     Неправильный указатель #1
Всем доброго времени суток. Возникла проблема со строками. Пытаюсь создать функцию которая будет удалять из строки все символы в заданном промежутке(она на удивление работает). Возник вопрос, когда я запустил ф-цию через отладчик то при создании указателя на новую строку в отладчике у меня появляется сообщение что создан неправильный указатель(как оказалось позже в функции мейн при создании строки тоже появляется такое сообщение), если не трудно подскажите почему указатель неправильный и как это исправить? вот код программы.
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
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();
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16832 / 5253 / 322
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
26.12.2013, 15:54     Неправильный указатель #3
Цитата Сообщение от Hrollo Посмотреть сообщение
в отладчике у меня появляется сообщение что создан неправильный указатель
Напиши дословно, что там написано. В твоём коде ничего неправильного нет
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
26.12.2013, 20:13  [ТС]     Неправильный указатель #4
str 0xcccccccc <Неправильный указатель> - это выскакивает при создании указателя
CXX0030: ошибка: невозможно вычислить выражение - это код ошибки
str 0x007e48a8 "ННННННННННННННННННННННээээ««««««««оюоюою" - это насколько я понял содержится в указателе
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16832 / 5253 / 322
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
26.12.2013, 20:22     Неправильный указатель #5
Цитата Сообщение от Hrollo Посмотреть сообщение
str 0xcccccccc <Неправильный указатель> - это выскакивает при создании указателя
Что значит "выскакивает"? Ты ничего не делаешь и оно вдруг выскакивает? Или ты стоишь в отладчике на этой строке (str = new ..), просишь напечатать значение переменной и оно выскакивает? Если так, тот тут всё логично. Этот момент времени соответствует тому, когда значение ещё НЕ записано (т.е. ты стоишь на той точке, в которой операция ещё НЕ выполнилась)

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

Другими словами, в программе у тебя всё правильно, ты просто немного не так работаешь с отладчиком, или немного не верно интерпретируешь его порывы облегчить тебе жизнь
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
26.12.2013, 20:40  [ТС]     Неправильный указатель #6
Спасибо за объяснение. Я думал что это я чтото не так делаю
Yandex
Объявления
26.12.2013, 20:40     Неправильный указатель
Ответ Создать тему
Опции темы

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