0 / 0 / 0
Регистрация: 24.02.2018
Сообщений: 23

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

25.03.2018, 01:27. Показов 3865. Ответов 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,430
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,430
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
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,067
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,038
Записей в блоге: 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,931
Записей в блоге: 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
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,067
25.03.2018, 11:07
Цитата Сообщение от Olej Посмотреть сообщение
1. Во-первых, такой вариант (с static) назвали раза 3 ... читайте внимательно прежде, чем писать;
Сейчас только один раз нашел, без комментариев и сливающийся с цитатой
Цитата Сообщение от Olej Посмотреть сообщение
2. Во-вторых, никакая переменная теперь не "локальная"
Не путайте область видимости (локальная) и время жизни (глобальная). Я говорил именно про область видимости.
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,480
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,931
Записей в блоге: 5
25.03.2018, 11:23
Цитата Сообщение от Recrut_rf Посмотреть сообщение
А можно ссылку на данную инфу
По хорошему надо искать официальный стандарт. Но можно найти и описание человеческим языком. Здесь, например, говорится http://www.quizful.net/post/cpp-keywords-usage В любой книге по языку есть перечисление зарезервированных слов. Слово auto там есть. Но это слово и в программу вставить можно. Любой компилятор (старого стандарта) его проглотит. Современный компилятор выдаст предупреждение.
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,480
25.03.2018, 11:34
palva, Это не совсем то, что я хотел узнать - про все эти volatile, extern, register, mutable мне и так было известно - я впервые слышу про то, что:
Цитата Сообщение от palva Посмотреть сообщение
Можно убрать слово static, но можно заменить его на auto, что будет эквивалентным.
В новых версиях языка слово auto используется в другом смысле, поэтому теперь его активно не рекомендуют применять, правда, не особо и хотелось.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 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,931
Записей в блоге: 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,038
Записей в блоге: 1
25.03.2018, 11:50
Цитата Сообщение от Olej Посмотреть сообщение
Это было сильно раньше
Да не так уж и сильно.

Цитата Сообщение от Olej Посмотреть сообщение
не вспоминайте это старьё, чтобы не смущать молодёжь и не создавать им в голове бессмыслицу.
Возможно, они придут на работу, а там компилятор с не полной поддержкой C++98.
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,480
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 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru