36 / 36 / 27
Регистрация: 05.11.2013
Сообщений: 149
1

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

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

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Возникла проблема со строками. Пытаюсь создать функцию которая будет удалять из строки все символы в заданном промежутке(она на удивление работает). Возник вопрос, когда я запустил ф-цию через отладчик то при создании указателя на новую строку в отладчике у меня появляется сообщение что создан неправильный указатель(как оказалось позже в функции мейн при создании строки тоже появляется такое сообщение), если не трудно подскажите почему указатель неправильный и как это исправить? вот код программы.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2013, 23:50
Ответы с готовыми решениями:

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

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

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

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения...

5
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.12.2013, 15:54 3
Цитата Сообщение от Hrollo Посмотреть сообщение
в отладчике у меня появляется сообщение что создан неправильный указатель
Напиши дословно, что там написано. В твоём коде ничего неправильного нет
0
36 / 36 / 27
Регистрация: 05.11.2013
Сообщений: 149
26.12.2013, 20:13  [ТС] 4
str 0xcccccccc <Неправильный указатель> - это выскакивает при создании указателя
CXX0030: ошибка: невозможно вычислить выражение - это код ошибки
str 0x007e48a8 "ННННННННННННННННННННННээээ««««««««оюоюою" - это насколько я понял содержится в указателе
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.12.2013, 20:22 5
Цитата Сообщение от Hrollo Посмотреть сообщение
str 0xcccccccc <Неправильный указатель> - это выскакивает при создании указателя
Что значит "выскакивает"? Ты ничего не делаешь и оно вдруг выскакивает? Или ты стоишь в отладчике на этой строке (str = new ..), просишь напечатать значение переменной и оно выскакивает? Если так, тот тут всё логично. Этот момент времени соответствует тому, когда значение ещё НЕ записано (т.е. ты стоишь на той точке, в которой операция ещё НЕ выполнилась)

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

Другими словами, в программе у тебя всё правильно, ты просто немного не так работаешь с отладчиком, или немного не верно интерпретируешь его порывы облегчить тебе жизнь
1
36 / 36 / 27
Регистрация: 05.11.2013
Сообщений: 149
26.12.2013, 20:40  [ТС] 6
Спасибо за объяснение. Я думал что это я чтото не так делаю
0
26.12.2013, 20:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2013, 20:40
Помогаю со студенческими работами здесь

А почему нельзя передавать в ф-ю добавления элемента в стек один указатель? Почему нужен именно указатель на указатель?
Вот код ф-ии добавления элемента в стек: void push1(Node **top, int d) { // top...

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

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

Указатель типа void. Использование косвенного связывания через универсальный указатель
Необходимо использовать косвенного связывания через универсальный указатель, примерный вид: struct...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru