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

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

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

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

15.07.2009, 21:56. Просмотров 1018. Ответов 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()..
Или я не прав?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2009, 21:56     Странная инструкция))
Посмотрите здесь:

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

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

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

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

Есть ли инструкция по использованию 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 байта. Допустим во всём...

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

но в вашем коде есть ошибка...
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 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 Посмотреть сообщение
Смутила функция, приведенная в примере одной книжки:
выкинь ту книгу.
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
15.07.2009, 22:16     Странная инструкция)) #4
VorobeY1326, данный пример даёт повод задуматься на предмет того, что может быть книгу "в печь"?
Delphin_KKC
UNIX-way
709 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
15.07.2009, 22:16     Странная инструкция)) #5
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
...
Может ли после return atoi(p); находится какая либо инструкция??
Находиться может. Только выполняться она не будет. Ибо
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
...
...после этой инструкции функция передает управление в ...
Только не в мейн, а вызывающую функцию.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
15.07.2009, 23:14     Странная инструкция)) #6
а в чем собсно ошибка, если и ошибка, то только логическая
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
15.07.2009, 23:33     Странная инструкция)) #7
alex_x_x, ошибка в
Цитата Сообщение от VorobeY1326 Посмотреть сообщение
C++
1
char *p = get();
так делать нельзя
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.07.2009, 00:08     Странная инструкция)) #8
не понял, чтобы применить atoi надо скопировать строку?
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.07.2009, 00:23     Странная инструкция)) #9
alex_x_x, указатель не проинициализирован.. т.е. он указывает на случайную область памяти.. и может стереть и записать данные в область, используемую другой программой (хоть ось и пытается предотвратить это.. но риск все равно существует)
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.07.2009, 00:26     Странная инструкция)) #10
ну другой программы допустим не может, не в век реальной памяти живем, и почему не инициализирован если get() возвращает указатель на некоторую строку
Search..
Заказ софта
340 / 185 / 10
Регистрация: 26.05.2009
Сообщений: 863
16.07.2009, 00:31     Странная инструкция)) #11
Ага, все, что стоит после оператора return - игнорируется..
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.... :-)
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
16.07.2009, 10:26     Странная инструкция)) #13
Ну delete там тоже лишний, память-то мы не выделяли, а так получается, что освобождается неизвестно что. Может изначально в примере была реализация через new, а потом изменили, не убрав строку.
Evg
Эксперт CАвтор FAQ
17537 / 5775 / 370
Регистрация: 30.03.2009
Сообщений: 15,904
Записей в блоге: 26
16.07.2009, 10:32     Странная инструкция)) #14
Цитата Сообщение от Gravity Посмотреть сообщение
Ну delete там тоже лишний, память-то мы не выделяли, а так получается, что освобождается неизвестно что. Может изначально в примере была реализация через new, а потом изменили, не убрав строку.
А кто вам сказал, что память не выделаем? Может в интерфейсе get сказано, что возвращаемая память выделяется динамически и пользователь сам её должен освобождать (как, например, в strdup). Или get это какая-то стандартная вещь (просто я что-то про такое не слышал)?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2009, 10:50     Странная инструкция))
Еще ссылки по теме:

Странная ошыбка - C++
Всём привет Есть такая проблема: при использовании qsort(&c, c.size(), sizeof(int), compare) Кидает ексепшен, почёму понять не могу....

Странная ошибка - C++
// ConsoleApplication5.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> ...

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

Странная функция - C++
Здравствуйте. Кто-нибудь сталкивался с такой функцией. Yi известно....

Странная ошибка - C++
#ifndef HUGEINTEGER_H #define HUGEINTEGER_H class HugeInteger { public: ...


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

Или воспользуйтесь поиском по форуму:
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
16.07.2009, 10:50     Странная инструкция)) #15
Цитата Сообщение от Evg Посмотреть сообщение
А кто вам сказал, что память не выделаем? Может в интерфейсе get сказано, что возвращаемая память выделяется динамически и пользователь сам её должен освобождать (как, например, в strdup).
Тоже вариант. Для разъяснений пожалуй нужно обратиться к текстам упомянутой книги.
Yandex
Объявления
16.07.2009, 10:50     Странная инструкция))
Ответ Создать тему
Опции темы

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