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

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

25.03.2018, 01:27. Показов 3486. Ответов 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,460
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,460
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,460
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 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru