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

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

Войти
Регистрация
Восстановить пароль
 
 
VorobeY1326
Ученик 11 класса)
4 / 4 / 0
Регистрация: 11.04.2009
Сообщений: 67
#1

Странная инструкция)) - C++

15.07.2009, 21:56. Просмотров 1054. Ответов 17
Метки нет (Все метки)

Доброго времени суток!
Смутила функция, приведенная в примере одной книжки:
C++
1
2
3
4
5
6
7
 
int stringparcer::get_int()
{
        char *p = get();
        return atoi(p);
        delete [] p;
}
Может ли после return atoi(p); находится какая либо инструкция??
Мне казалось, что после этой инструкции функция передает управление в main()..
Или я не прав?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2009, 21:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Странная инструкция)) (C++):

Странная(или не странная, незнаю) реакция на буквы, знаки операций - C++
Всем добрый день. Делаю маленькую наработку, пока есть только начало. Ниже код: #include <iostream> #include <cstdlib> using...

инструкция if - C++
#include <iostream> using namespace std; int main() { std::locale().global(std::locale("")); int a, b; cout << "14: ";...

Инструкция break - C++
Эм, балуюсь с C++. Значит, отбираю простые числа, первый вариант программы: #include <iostream> #include <cstdlib> #include...

Инструкция if(.) continue - C++
Объясните пожалуйста как работает эта инструкция на таком примере: #include <bits/stdc++.h> using namespace std; int main() { ...

Инструкция SWITCH - C++
Есть программа поиска НОД - работает прекрасно. Нужно сделать выбор 1 - НОД по 2 простым числам 2 - НОД по 3 простым числам. (добавлю...

Goto и инструкция объявления - C++
Здравствуйте, есть одна программа, которая вызвала у меня вопросы. Читаю книгу Липманна C++ для начинающих. Прохожу инструкцию goto, вот...

17
Monte-Cristo
2794 / 1380 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.07.2009, 22:12 #2
VorobeY1326, вы правы.. за исключением того, что управление передается не функции main() а вызывающей функции ( той функции, из которой данная была вызвана )

но в вашем коде есть ошибка...
0
ISergey
Maniac
Эксперт С++
1407 / 918 / 57
Регистрация: 02.01.2009
Сообщений: 2,736
Записей в блоге: 1
15.07.2009, 22:16 #3
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Может ли после return atoi(p); находится какая либо инструкция??
нет. то ошибка.

Добавлено через 3 минуты 9 секунд
уже лучше так сделать
C++
1
2
3
4
5
6
7
8
int stringparcer::get_int()
{
       // char *p = get();
        char p[20];
        strcpy(p, get());
        return atoi(p);
        //delete [] p;
}
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
Смутила функция, приведенная в примере одной книжки:
выкинь ту книгу.
1
Evg
Эксперт CАвтор FAQ
18885 / 6841 / 498
Регистрация: 30.03.2009
Сообщений: 19,270
Записей в блоге: 30
15.07.2009, 22:16 #4
VorobeY1326, данный пример даёт повод задуматься на предмет того, что может быть книгу "в печь"?
0
Delphin_KKC
UNIX-way
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
15.07.2009, 22:16 #5
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
...
Может ли после return atoi(p); находится какая либо инструкция??
Находиться может. Только выполняться она не будет. Ибо
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
...
...после этой инструкции функция передает управление в ...
Только не в мейн, а вызывающую функцию.
1
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
15.07.2009, 23:14 #6
а в чем собсно ошибка, если и ошибка, то только логическая
0
Monte-Cristo
2794 / 1380 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.07.2009, 23:33 #7
alex_x_x, ошибка в
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
C++
1
char *p = get();
так делать нельзя
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.07.2009, 00:08 #8
не понял, чтобы применить atoi надо скопировать строку?
0
Monte-Cristo
2794 / 1380 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.07.2009, 00:23 #9
alex_x_x, указатель не проинициализирован.. т.е. он указывает на случайную область памяти.. и может стереть и записать данные в область, используемую другой программой (хоть ось и пытается предотвратить это.. но риск все равно существует)
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.07.2009, 00:26 #10
ну другой программы допустим не может, не в век реальной памяти живем, и почему не инициализирован если get() возвращает указатель на некоторую строку
0
Search..
Заказ софта
340 / 185 / 10
Регистрация: 26.05.2009
Сообщений: 863
16.07.2009, 00:31 #11
Ага, все, что стоит после оператора return - игнорируется..
1
interferent
6 / 5 / 0
Регистрация: 15.07.2009
Сообщений: 7
16.07.2009, 04:19 #12
Подозреваю, что они хотели примерно такого:
C++
1
2
3
4
5
6
7
int stringparcer::get_int()
{
        char *p = get();
        int i=atoi(p);
        delete [] p;
        return i;
}
И компиляторы часто предупреждают: unreachable code.... :-)
1
Gravity
569 / 563 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
16.07.2009, 10:26 #13
Ну delete там тоже лишний, память-то мы не выделяли, а так получается, что освобождается неизвестно что. Может изначально в примере была реализация через new, а потом изменили, не убрав строку.
0
Evg
Эксперт CАвтор FAQ
18885 / 6841 / 498
Регистрация: 30.03.2009
Сообщений: 19,270
Записей в блоге: 30
16.07.2009, 10:32 #14
Цитата Сообщение от Gravity Посмотреть сообщение
Ну delete там тоже лишний, память-то мы не выделяли, а так получается, что освобождается неизвестно что. Может изначально в примере была реализация через new, а потом изменили, не убрав строку.
А кто вам сказал, что память не выделаем? Может в интерфейсе get сказано, что возвращаемая память выделяется динамически и пользователь сам её должен освобождать (как, например, в strdup). Или get это какая-то стандартная вещь (просто я что-то про такое не слышал)?
1
Gravity
569 / 563 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
16.07.2009, 10:50 #15
Цитата Сообщение от Evg Посмотреть сообщение
А кто вам сказал, что память не выделаем? Может в интерфейсе get сказано, что возвращаемая память выделяется динамически и пользователь сам её должен освобождать (как, например, в strdup).
Тоже вариант. Для разъяснений пожалуй нужно обратиться к текстам упомянутой книги.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2009, 10:50
Привет! Вот еще темы с ответами:

Есть ли инструкция по использованию std::regex - C++
Есть какой-то мануальчик по использованию сего чуда в c++11? Ну или подскажите как найти в поле string все href вне зависимости от...

Вычислить квадраты четных чисел 0 . 100, инструкция for - C++
#include<iostream> #include<conio.h> using namespace std; int main() { int square(int i); int i; for(int i = 0;...

Инструкция процессора для инкремента диапазона памяти без предварительного чтения - C++
Есть диапазон памяти, то есть массив, допустим int-ов, то есть в памяти подряд идут, к примеру, 100 значений по 4 байта. Допустим во всём...

Странная формула. - C++
Есть задание: Дано натуральное n, вычислить 1/0!+1/1!+...+1/n! Как понимать эту формулу?


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

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

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