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

Есть динамический массив с размерностью 5, необходимо его сделать с размерностью 6, заполнить цифрами и вывести на экран

27.03.2014, 18:16. Показов 1831. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый.
Не хочется никому морочить голову дурацкими вопросами, поэтому стараюсь находить на все свои вопросы ответы сам. Но тут я столкнулся с совершенно непонятной для меня проблемой и решение ее нигде не могу найти. Когда я запускаю выполнение программы на экран выводится полная ерунда , но если запустить отладчик все нормально и на экран выводятся данные динамического массива. Из-за чего такое может происходить? Голову ломаю второй день. Задача следующая - есть динамический массив с размерностью 5, необходимо его сделать с размерностью 6, заполнить цифрами и вывести на экран. Код, который внизу, при запуске отладчика все отлично выводит на экран, а при запуске программы выводить ерунду. Буду очень благодарен если кто-то натолкнет на решение проблемы. Пользуюсь стандартным инструментарием microsoft visual studio 2010
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <stdlib.h>
using namespace std;
void masplus(float*, int*);
void main ()
{   
    int size=5;
        float* mas1;
    mas1 = new float[size];
        
    masplus(mas1, &size);
    
    for(int i=0;i<size; i++)
         cout<<mas1[i];
}
 
void masplus(float* mas, int *n)
{
    delete [] mas;
    *n+=1;
    mas = new float[*n];
    for(int i=0;i<*n; i++)
        mas[i]=i;
 
}
P.S.
Если просто заполнить массив данными , то все ОК и в отладчике и в запуске программы, если сделать как в коде вверху, то в отладчике ОК , а при запуске программы нет.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2014, 18:16
Ответы с готовыми решениями:

Создать и вывести на экран двумерный массив целых чисел размерностью 3х3
1. создать и вывести на экран двумерный массив целых чисел размерностью 3х3 2. создать и вывести на экран двумерный массив вещественных...

Как создать динамический массив размерностью m на n?
подскажите, а то я только n на n создавать умею)

Сформировать динамический двумерный массив, заполнить его случайными числа-ми и вывести на экран монитора. Добавить строку в начало матрицы
Помогите на завтра сделать лабу 2.Сформировать динамический двумерный массив, заполнить его случайными числа-ми и вывести на экран...

18
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
27.03.2014, 18:41
Цитата Сообщение от CheburatorUA Посмотреть сообщение
*n+=1;
не уверен
но по моему нарушен приоритет, не увеличиваешь значение а увеличиваешь адрес
по аналогии
C++
1
*n++
попробуй перепиши
вот так
C++
1
*n=(*n)+1;
или так
C++
1
(*n)+=1;
пройди по шагам и проверь
а лучше пользуйся не указателем а ссылкой

C++
1
2
3
4
5
6
7
8
9
10
11
void masplus(float* mas, int &n)
{
    delete [] mas;
    n+=1;
    mas = new float[n];
    for(int i=0;i<n; i++)
        mas[i]=i;
 
}
 
masplus(mas1, size);
0
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
27.03.2014, 21:49  [ТС]
Нет , не помогает.
И если я иду именно по шагам в отладчике, то все работает и указателем и ссылкой. Но только я запускаю программу на экран выводится как будто массив не заполнен.
0
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
27.03.2014, 22:09  [ТС]
А вот если отладчиком идти по шагам все получается, как такое возможно?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 22:10
Цитата Сообщение от CheburatorUA Посмотреть сообщение
Код, который внизу, при запуске отладчика все отлично выводит на экран, а при запуске программы выводить ерунду.
У меня всё нормально выводит.
Миниатюры
Есть динамический массив с размерностью 5, необходимо его сделать с размерностью 6, заполнить цифрами и вывести на экран  
0
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
27.03.2014, 22:20  [ТС]
Это наверно проблема в моем microsoft visual studio 2010?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.03.2014, 22:27
Цитата Сообщение от ValeryS Посмотреть сообщение
но по моему нарушен приоритет, не увеличиваешь значение а увеличиваешь адрес
Нет, там все в порядке.
CheburatorUA,
Обратив внимание, что ты скопировал указатель в функцию. Снаружи осталось старое значение. А новый массив выделился в совершенно новом месте. Попробуй вот такой код, он должен работать правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <stdlib.h>
using namespace std;
void masplus(float* &, int*);
int main ()
{
    int size=5;
    float* mas1;
    mas1 = new float[size];
 
    masplus(mas1, &size);
 
    for(int i=0;i<size; i++)
         cout<<mas1[i];
}
 
void masplus(float* & mas, int *n)
{
    delete [] mas;
    *n+=1;
    mas = new float[*n];
    for(int i=0;i<*n; i++)
        mas[i]=i;
}
Добавлено через 17 секунд
Цитата Сообщение от CheburatorUA Посмотреть сообщение
Это наверно проблема в моем microsoft visual studio 2010?
Нет, проблема в UB в коде.

Добавлено через 5 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня всё нормально выводит.
Потому что нормально работающая программа - частный случай неопределенного поведения
2
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 22:37
Цитата Сообщение от DrOffset Посмотреть сообщение
Обратив внимание, что ты скопировал указатель в функцию.
Да, сейчас увидел. Странно, что у меня выводит не мусор.
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет, проблема в UB в коде.
А почему UB? Почему у меня выводит не мусор?

Добавлено через 3 минуты
Как в особождённой памяти оказываются данные из памяти под другим массивом?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.03.2014, 22:43
Цитата Сообщение от alsav22 Посмотреть сообщение
А почему UB?
Доступ по указателю к которому был применен delete - UB

Цитата Сообщение от alsav22 Посмотреть сообщение
Как в особождённой памяти оказываются данные из памяти под другим массивом?
Может случиться, если компилятор встроит функцию.
1
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
27.03.2014, 22:46  [ТС]
Да, такой код заработал, спасибо.
Вот только тогда почему если делать пошагово в отладчике, то все работает, я даже выше скришнот прикрепил. А у alsav22 вообще все получилось с моим кодом, мистика).

Еще раз спасибо за работающий код.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.03.2014, 22:48
Цитата Сообщение от CheburatorUA Посмотреть сообщение
Вот только тогда почему если делать пошагово в отладчике, то все работает
Неопределенное поведение, это термин для обозначения поведения некорректной программы. Оно может выражаться в том числе и в том, что все работает нормально. Ты понял почему была проблема?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
27.03.2014, 22:51
Цитата Сообщение от CheburatorUA Посмотреть сообщение
Вот только тогда почему если делать пошагово в отладчике, то все работает,
потому что UB неопределенное поведение
при релизе идет оптимизация и результирующий код совершенно не похож на исходный
попробуй отключи оптимизацию и проверь
Цитата Сообщение от DrOffset Посмотреть сообщение
Обратив внимание, что ты скопировал указатель в функцию.
как я на это не обратил внимания на четыре раза пересмотрел и не заметил
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.03.2014, 22:52
Цитата Сообщение от DrOffset Посмотреть сообщение
Как в особождённой памяти оказываются данные из памяти под другим массивом?
alsav22, кстати, про встраивание я зря сказал: оптимизация не должна влиять на поведение программы. Скорее всего это может случиться, если new вернет тот же самый адрес, при новом выделении памяти. Оказался свободный участок в том же месте. Просто повезло.

UPD: проверил у себя, так и есть - адреса равны, в итоге все работает. При чем даже в релизе. Но это случайность.
1
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
27.03.2014, 23:14  [ТС]
Ты понял почему была проблема?
Да, вроде. Не ожидал я такого нюанса. Завтра на свежую голову еще обдумаю.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.03.2014, 23:20
CheburatorUA, ключевое слово "копия" Ты записал новое значение от new в копию. А исходное, которое ты передавал осталось старым (и уже невалидным, т.к. был delete[]). Так получилось что new вернул тот же самый адрес, в итоге ничего не сломалось.
0
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
31.03.2014, 00:23  [ТС]
Как-то странно все равно. В моей версии в main проинициализировали указатель, затем под этот указатель выделена память для массива. Указатель передан в функцию, затем по этому указателю память удалена и снова выделена, но на одну ячейку больше. Ну выделена эта память в копии т.е. в функции, но ведь указатель не поменялся и память выделена. Перечитав довольно много литературы я так понял , что указатели именно для таких ситуаций и существуют, а тут оказалось, что необходимо еще дополнительно и ссылку указывать.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.03.2014, 00:33
Лучший ответ Сообщение было отмечено CheburatorUA как решение

Решение

Цитата Сообщение от CheburatorUA Посмотреть сообщение
Перечитав довольно много литературы я так понял , что указатели именно для таких ситуаций и существуют
Всё хорошо пока действия в функции, куда передан указатель по значению (копия), осуществляются над данными, адрес которых находится в указателе:
Цитата Сообщение от CheburatorUA Посмотреть сообщение
затем по этому указателю память удалена
Адрес и в копии, и в оригинале (в main()) пока одинаковы, поэтому всё хорошо.
Цитата Сообщение от CheburatorUA Посмотреть сообщение
и снова выделена, но на одну ячейку больше.
Цитата Сообщение от CheburatorUA Посмотреть сообщение
но ведь указатель не поменялся и память выделена.
В том то и дело, что поменялся (поменялся адрес, который хранится в указателе).
При выделении новой памяти, адрес этой памяти записыается в сам указатель, т.е. меняются уже не данные, адрес которых находится в указателе, а сам этот адрес (значение указателя), и меняется он в копии, а не в том указателе, который был в main().
2
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
31.03.2014, 00:49
Цитата Сообщение от CheburatorUA Посмотреть сообщение
еще дополнительно и ссылку указывать.
Ссылку не обязательно. Есть еще вариант с указателем на указатель (float **). Тогда мы будем передавать адрес указателя, который указывает на наши данные. И через этот адрес мы всегда можем получить доступ к тому самому указателю (в нашем случае он будет находиться в main), указывающему на наши данные. Я всегда тем, кто плохо понимает всю эту кухню, рисую схемы на доске. Но здесь не получится, так что попробуй понять, что написали alsav22 и я.
2
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
31.03.2014, 13:37  [ТС]
Спасибо за пояснения. Теперь я понял. А то я не мог сам понять, меня как заклинило на этом указателе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.03.2014, 13:37
Помогаю со студенческими работами здесь

Заполнить массив размерностью 6x6 по правилу
Заполнить массив размерностью 6x6 по правилу 1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3 5 6 1 2 3 4 6 1 2 3 4 5

Массив размерностью 100 заполнить случайными числами
Помогите с заданием,кому не трудно. Массив размерностью 100 заполнить случайными числами, лежащими в диапазоне от –10 до 10. Во всех...

Создать динамический массив, заполнить его и вывести
Задача такая, создать динамический массив, заполнить его и вывести. Набросал код #include &lt;iostream&gt; using namespace std; ...

Создать массив размерностью 7 х 7, заполнить его случайным образом цифрами
Создать массив размерностью 7 х 7, заполнить его случайным образом цифрами 7, 5 и 2. Результат в виде матрицы записать в текстовый файл..

Заполнить и вывести на экран массив размерностью 5 квадратами номеров элементов
Заполнить и вывести на экран массив размерностью 5 квадратами номеров эле-ментов


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru