Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 24.02.2018
Сообщений: 23

Некорректно работают указатели на функцию

25.03.2018, 01:27. Показов 3433. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В режиме отладки видно что, функция возвращает правильный результат, но на экран выводится какой-то мусор.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int* a()
{
    int b[] = { 1,2,3 };
    return b;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int *ar;
    ar = a();
    
    cout << ar[0] << ar[1] << ar[2];
 
    _getch();
    return 0;
}
Почему так происходит? Как это исправить? Как это работает?
Миниатюры
Некорректно работают указатели на функцию   Некорректно работают указатели на функцию   Некорректно работают указатели на функцию  

Некорректно работают указатели на функцию   Некорректно работают указатели на функцию   Некорректно работают указатели на функцию  

0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2018, 01:27
Ответы с готовыми решениями:

некорректно работают условия
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &quot;locale&quot; #include &quot;stdlib.h&quot; int main() { int q; float a, b, r; ...

2 функции по перестановке векторов работают некорректно
Написал 2 функции по перестановки векторов, они делают свою работы, но не так как нужно. В начале пявляеться набор чисел, а если запускать...

Не работают указатели
Как сделать указатели на функцию в моем случае? много чего перепробовал, ничего не работает. помогите пжлста. #include...

73
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
25.03.2018, 02:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Olej Посмотреть сообщение
Это херня, вьюношо
Я понимаю, что это херня - но почему эта херня выдает то, чего не должна - вот это не ясно)
На удивление - Релиз проект вообще сохраняет значения и после "единождого" вызова оО
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.03.2018, 02:49
Цитата Сообщение от SuperKir Посмотреть сообщение
сразу после момента присвоения, они не затираются мусором
но с некоторой вероятностью при обращении к ним получишь вылет. Не с первого, но раза с 50-100 го вполне. Операционная система следит за твоей программой

Не очищается,потому что освобождение памяти - это разрешение другим ею пользоваться, а не затирание нулями/мусором. И уже деятельность других программ создаёт т.н. "мусор".
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.03.2018, 02:52
Цитата Сообщение от SuperKir Посмотреть сообщение
Да
Нет. Это взятие адреса и разыменование. То есть: return *&b, равнозначно просто return b.
2
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.03.2018, 02:52
А вот когда другие программы начать пользоваться той же областью памяти, который только что был освобождён от стека твоей функции - это уже вопрос к теории вероятности.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
25.03.2018, 03:08
Цитата Сообщение от nd2 Посмотреть сообщение
Это взятие адреса и разыменование
int* - Указатель на int
int*& - Ссылка на указатель на int.
int** - Указатель на указатель int
int**& - Ссылка на указатель на указатель на int.

Добавлено через 6 минут
В английской литературе нет понятия "взятие адреса" - это лишь запоминалка.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.03.2018, 03:09
Цитата Сообщение от SuperKir Посмотреть сообщение
int*& - Ссылка на указатель на int.
И что? У тебя же не так, а так:
Цитата Сообщение от SuperKir Посмотреть сообщение
C++
1
2
int *b = new int[3]{ 1,2,3 }; 
return *&b; // взятие адреса указателя и его разыменование
Добавлено через 43 секунды
Цитата Сообщение от SuperKir Посмотреть сообщение
В английской литературе нет понятия "взятие адреса" - это лишь запоминалка.
А "Разыменование" - это оператор ->
Читай литературу внимательнее.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
25.03.2018, 03:14
Цитата Сообщение от nd2 Посмотреть сообщение
И что? У тебя же не так, а так:
Кстати да.. пора спать походу
Был не прав, соррян
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
25.03.2018, 09:26
Почему-то никто не предложил рабочий вариант
C
1
2
3
4
int* a(){
    static int b[3] = { 1,2,3 }; //вот теперь переменная объявлена локальной, но существует глобально
    return &b[0];
}
0
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
25.03.2018, 10:09
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Почему-то никто не предложил рабочий вариант
1. Во-первых, такой вариант (с static) назвали раза 3 ... читайте внимательно прежде, чем писать;

2. Во-вторых, никакая переменная теперь не "локальная", она в объектном файле будет размещена в секции инициированных данных, а вовсе не в стеке, где размещаются локальные переменные ... так же точно, как если бы она была описана на самом внешнем уровне файла, только описание её помещено в функцию, что скрывает её из глобального пространства видимости имён (не засоряет);

3. Не нужно там ничего мудрить! Никаких return &b[0]; - там более чем достаточно простого return b;
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
25.03.2018, 10:15
Цитата Сообщение от SuperKir Посмотреть сообщение
int* - Указатель на int
int*& - Ссылка на указатель на int.
int** - Указатель на указатель int
int**& - Ссылка на указатель на указатель на int.
Бредить так до конца.
int* - int умножить
int*& - int умножить побитовое И
int** - int умножить умножить
int**& - int умножить умножить побитовое И

Ну то есть сначала смотре где это *& стоит и только потом делай выводы.
1
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
25.03.2018, 10:47
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Почему-то никто не предложил рабочий вариант
nd2 предлагал вариант со static. Но это как-то потерялось за общей путаницей. Слово "статик" использовалось в смысле "автоматик" и противопоставлялось слову "динамик". Например:
Цитата Сообщение от SuperKir Посмотреть сообщение
Время жизни статик массива ограничено функцией. Объявляйте внутри функции динамический массив.
На самом деле до сих пор работает, но уже не рекомендован описатель auto, который и является противоположностью static. Все локальные переменные без слова static являются auto. Вот здесь
C++
1
static int b[3] = { 1,2,3 };
Можно убрать слово static, но можно заменить его на auto, что будет эквивалентным.
В новых версиях языка слово auto используется в другом смысле, поэтому теперь его активно не рекомендуют применять, правда, не особо и хотелось.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
25.03.2018, 11:07
Цитата Сообщение от Olej Посмотреть сообщение
1. Во-первых, такой вариант (с static) назвали раза 3 ... читайте внимательно прежде, чем писать;
Сейчас только один раз нашел, без комментариев и сливающийся с цитатой
Цитата Сообщение от Olej Посмотреть сообщение
2. Во-вторых, никакая переменная теперь не "локальная"
Не путайте область видимости (локальная) и время жизни (глобальная). Я говорил именно про область видимости.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,454
25.03.2018, 11:10
Цитата Сообщение от palva Посмотреть сообщение
Можно убрать слово static, но можно заменить его на auto, что будет эквивалентным.
В новых версиях языка слово auto используется в другом смысле, поэтому теперь его активно не рекомендуют применять, правда, не особо и хотелось.
А можно ссылку на данную инфу (самому искать очень лень ) Auto этож (если не ошибаюсь) нововведение C++11 и оно призвано облегчить жизнь пользователю с точки зрения выведения типа переменной. Ну то есть если до C++11 надо было писать int i = 0, то теперь auto i = 0, компилятор сам выведет тип переменной исходя из значения переменной (если сможет конечно же) Но причём здесь модификатор доступа static?
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
25.03.2018, 11:23
Цитата Сообщение от Recrut_rf Посмотреть сообщение
А можно ссылку на данную инфу
По хорошему надо искать официальный стандарт. Но можно найти и описание человеческим языком. Здесь, например, говорится http://www.quizful.net/post/cpp-keywords-usage В любой книге по языку есть перечисление зарезервированных слов. Слово auto там есть. Но это слово и в программу вставить можно. Любой компилятор (старого стандарта) его проглотит. Современный компилятор выдаст предупреждение.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,454
25.03.2018, 11:34
palva, Это не совсем то, что я хотел узнать - про все эти volatile, extern, register, mutable мне и так было известно - я впервые слышу про то, что:
Цитата Сообщение от palva Посмотреть сообщение
Можно убрать слово static, но можно заменить его на auto, что будет эквивалентным.
В новых версиях языка слово auto используется в другом смысле, поэтому теперь его активно не рекомендуют применять, правда, не особо и хотелось.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
25.03.2018, 11:38
Цитата Сообщение от Recrut_rf Посмотреть сообщение
про все эти volatile, extern, register, mutable мне и так было известно
auto пропустил.

Раньше спецификатор auto делал локальную переменную автоматической. Но они и так по-умолчанию были автоматическими.
int x;
Было эквивалентно
auto int x;
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
25.03.2018, 11:46
Цитата Сообщение от palva Посмотреть сообщение
Можно убрать слово static, но можно заменить его на auto, что будет эквивалентным.
Recrut_rf, наверно вы видите двусмысленность этого утверждения? Согласен. Фраза неудачная. Непонятно, что будет эквивалентным. Будут эквивалентны два текста, получающиеся в результате этих двух действий. Но не текст до действия и после.
0
 Аватар для Olej
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
25.03.2018, 11:49
Цитата Сообщение от Croessmah Посмотреть сообщение
Раньше спецификатор auto делал локальную переменную автоматической.
Это было сильно раньше ... лет уж 7-8 тому или больше auto имеет совершенно другой (и богатый) смысл (C++11).

Это было так давно, что всем кто так давно живёт, что это ещё помнит - совет: не вспоминайте это старьё, чтобы не смущать молодёжь и не создавать им в голове бессмыслицу.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
25.03.2018, 11:50
Цитата Сообщение от Olej Посмотреть сообщение
Это было сильно раньше
Да не так уж и сильно.

Цитата Сообщение от Olej Посмотреть сообщение
не вспоминайте это старьё, чтобы не смущать молодёжь и не создавать им в голове бессмыслицу.
Возможно, они придут на работу, а там компилятор с не полной поддержкой C++98.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,454
25.03.2018, 11:53
К примеру цитата из Справочного руководства по STL (Джосатиса) про auto:
"В языке С++11" можно объявить переменную или объект без указания их конкретного типа, использую ключевое слово auto. Тип переменной, объявленной с помощью ключевого слова auto, выводится из её инициализатора. Разрешается использование дополнительных квалификаторов. Например:
C++
1
static auto vat = 0.19
. Использование ключевого слова auto особенно полезно в ситуациях, когда тип является очень длинным, а выражение сложным. То есть это скорее аналог typedef (частичный) или что - то вроде шаблонного псевдонима (тоже нововведение C++11)

Добавлено через 59 секунд

Не по теме:

Сколько же здесь понаписали пока я сочинял свой "шедевр" :D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2018, 11:53
Помогаю со студенческими работами здесь

Как работают указатели с массивами
Хочу на простом примере перестановки двух элементов уяснить - как работают указатели с массивами, но ничего не получается. Объясните на...

Как работают ссылки и указатели?
Не нашел описание того, почему именно так работает, везде говорится только то, что так надо делать и все Аргумент функции является...

В функцию с переменным числом параметроы передать указатели на функцию
Добрый вечер. По заданию нужно в функцию с переменным числом параметров передать имя функций, которые нужно вызвать. Долго думала,как имея...

Кнопки регулировки громкости на клавиатуре иногда не работают и/или работают некорректно
Здравствуйте, у меня возникает некая неполадка/баг со звуком. Пользуюсь я данной клавиатурой, как видно на ней есть 3 кнопки для...

Некорректно работают скрипы
Доброго времени суток! Недавно столкнулся с такой проблемой...В общем, не работают кнопки на сайтах, не открываются картинки в яндексе,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru