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

Неправильная разадресация указателя на массив в цикле

26.02.2015, 18:56. Показов 2023. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!

Столкнулся с такой проблемой:
Есть массив
a[10] заполненный неотрицательными целыми числами.
Есть указатель на массив int *p = a;
Далее при выводе
C++
1
cout <<*p<<*(p+1)<<*(p+2);
и т.д. происходит корректный вывод последовательных элементов массива.
Но если сразу создать цикл:
C++
1
2
3
4
for (int i =0; i<10; i++)
{
    cout <<*p++;
}
выводятся произвольные числа, причем адреса, на которые указывает *p тоже корректны.
То есть по ним раньше лежали нужные элементы массива.

Такое ощущение, что при входе в цикл, адреса памяти, занятые элементами массива, заполняются чем попало

Помогите, если кто знает в чём дело!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.02.2015, 18:56
Ответы с готовыми решениями:

Разадресация указателя в массив из указателей
float *A, **B; A = new float ; B = new float* ; for (int i = 0; i &lt; n; i++) { //*(A + i) = rand()%1000 / 100; *(A + i) = n -...

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

Изменение значение указателя в цикле
Добрый день! У меня возникла проблема следущего характера: в цикле for (i=0;i&lt;(n*n);i++) у меня сбивается указатель, тоесть при i=4,...

18
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.02.2015, 19:01
Весь код показывайте.
0
20 / 20 / 1
Регистрация: 24.12.2014
Сообщений: 65
26.02.2015, 19:05
C++
1
2
3
4
for (int i =0; i<10; i++)
{
     cout <<*(p++);
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.02.2015, 19:09
Цитата Сообщение от WhoBadWolf Посмотреть сообщение
*(p++)
Унарные операции и так выполняются справа налево. Это где-то в не показанной части кода баг.
1
20 / 20 / 1
Регистрация: 24.12.2014
Сообщений: 65
26.02.2015, 19:12
Renji, будем ждать весь код
0
0 / 0 / 0
Регистрация: 26.02.2015
Сообщений: 19
26.02.2015, 23:00  [ТС]
Извиняюсь, что долго не отвечал.
Весь код это нормально
Не знаю как с виртуальной машины перекинуть на основную, поэтому самое главное ручками:
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
26
27
28
29
30
#include "StrSumNew.h" //описание заголовочного файла ниже
int main ()
{
char *chislo1;
chislo1=(char*)malloc(1000); //вводим первое число строкой
cin >> chislo1;
int len1 = strlen(chislo1); //находим длинну введенной строки
int maslen1[len1];           //создаю числовой массив для перевода в него строки
 
for (int l = 0; l < len1; l++)
{
    maslen1[l] = (int)chislo1[l] - 48;
}
 
//аналогично вводим второе число
 
int *s1;
s1 = plusser (maslen1, maslen2, len1, len2); //функция из созданного заголовочного файла
 
}
 
//описание plusser
int *plusser(int *x1, int *x2, int dl1, int dl2)
{
//вычисление более длинной строки 
//создание нового массива записы суммы двух строк a[dl1] если первое число длиннее
int *p1 = a; //указатель на первый элемент массива
// простые операции сложения и т. п. 
return p1;    // возвращаемое значение функции т.е. s1 это p1 (?!)
}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
26.02.2015, 23:04
Цитата Сообщение от Garptica Посмотреть сообщение
int maslen1[len1]; //создаю числовой массив для перевода в него строки
прям вот так и создаешь?
компилятор какой?
0
0 / 0 / 0
Регистрация: 26.02.2015
Сообщений: 19
26.02.2015, 23:11  [ТС]
не создаю, инициализирую.
gcc 4.8.2-19ubuntu1
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.02.2015, 23:13
Цитата Сообщение от Garptica Посмотреть сообщение
Не знаю как с виртуальной машины перекинуть на основную, поэтому самое главное ручками:
Я не вижу здесь кода вокруг обсуждаемого *p++. Вообще, обрежьте код до короткого тестового примера и его и выкладывайте.
Цитата Сообщение от ValeryS Посмотреть сообщение
прям вот так и создаешь?
VLA. Возможность C, которую использовать в C++ не по феншую (ибо поддержка не гарантируется).
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
26.02.2015, 23:16
Цитата Сообщение от Garptica Посмотреть сообщение
gcc 4.8.2-19ubuntu1
понятно
это не стандартное решение, в С++, нельзя так объявлять массивы
но gcc дозволяет
с другими компиляторами горя хапнешь
так что по правильному выделяй память через new
Цитата Сообщение от Garptica Посмотреть сообщение
не создаю, инициализирую.
Да гдеж ты его инициализируешь?
Цитата Сообщение от Garptica Посмотреть сообщение
int maslen1[len1]; //создаю числовой массив для перевода в него строки
Цитата Сообщение от Garptica Посмотреть сообщение
//создание нового массива записы суммы двух строк a[dl1] если первое число длиннее
int *p1 = a; //указатель на первый элемент массива
// простые операции сложения и т. п.
хотелось бы подробностей
0
0 / 0 / 0
Регистрация: 26.02.2015
Сообщений: 19
26.02.2015, 23:21  [ТС]
C++
1
2
3
4
5
6
7
s1 = plusser(maslen1, maslen2, len1, len2);
cout <<*s1<<*(s1+1)<<*(s1+2); //и так далее - выводятся элементы массива
 
for (int i=0; i<max(len1,len2); i++)
{
    cout <<*(s1+i);                        //выводятся производьные значения:(
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.02.2015, 23:26
Вангую что plusser возвращает указатель на созданный в стеке (не через new) массив, накрывшийся сразу после завершения plusser. То есть, указатель не пойми куда, по которому лежит не пойми что.
0
0 / 0 / 0
Регистрация: 26.02.2015
Сообщений: 19
26.02.2015, 23:44  [ТС]
Окей, не инициализирую, а обьявляю.

Добавлено через 17 минут
А как через new обьявить массив?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.02.2015, 23:46
Лучший ответ Сообщение было отмечено Garptica как решение

Решение

C++
1
2
3
4
5
int*array=new int[100];//объявляем
delete[]array;//удаляем
std::vector<int>array1(100);//делаем динамический массив по феншую
//В отличие от, его можно возвращать и через return
//Только как std::vector<int>, а не указатель на std::vector<int>
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
26.02.2015, 23:47
Лучший ответ Сообщение было отмечено Garptica как решение

Решение

Цитата Сообщение от Garptica Посмотреть сообщение
А как через new обьявить массив?
вот так
C++
1
int* arr=new int[100];
и это бы неплохо в плюсовом стиле сделать
Цитата Сообщение от Garptica Посмотреть сообщение
char *chislo1;
chislo1=(char*)malloc(1000); //вводим первое число строкой
C++
1
char *chislo1= new char[1000];
0
0 / 0 / 0
Регистрация: 26.02.2015
Сообщений: 19
27.02.2015, 00:01  [ТС]
да, так всё работает отлично!
А можно через new в квадратных скобках задавать размер через переменную? Типа int* array = new int[my_var];
Вдруг строка (число) будет иметь длину больше 100 (в случае если new int[100])?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
27.02.2015, 00:03
Цитата Сообщение от Garptica Посмотреть сообщение
А можно через new в квадратных скобках задавать размер через переменную? Типа int* array = new int[my_var];
можно
это как раз
Цитата Сообщение от Renji Посмотреть сообщение
по феншую

Цитата Сообщение от Garptica Посмотреть сообщение
int maslen1[len1]; //создаю числовой массив для перевода в него строки
C++
1
int *maslen1=new[len1];
0
0 / 0 / 0
Регистрация: 26.02.2015
Сообщений: 19
27.02.2015, 00:07  [ТС]
Ок, спасибо большое! Погнал дальше делать, извиняюсь за тупые вопросы, просто сегодня с утра еще с "hello world"
возился! День прошел не зря
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.02.2015, 00:12
Цитата Сообщение от Garptica Посмотреть сообщение
А можно через new в квадратных скобках задавать размер через переменную? Типа int* array = new int[my_var];
Оно, конечно, можно, но удобнее работать через std::vector и std::string. Потому что не надо думать забыл ты поставить delete[] или нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2015, 00:12
Помогаю со студенческими работами здесь

Асинхронный запрос в цикле XMLHttpRequest неправильная работа
Доброго времени суток уважаемые пользователи. Уже 4 часа бьюсь над выполнением задания. Необходимо создать асинхронный запрос в цикле...

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

Передача указателя на массив
есть arr обьявлен и инициализирован требуется обьявить функцию передать в функцию указатель на массив (т.е. не сам массив через стек,...

Преобразование указателя в массив
Всем привет. Есть указатель с типом const u_char * , известно , что он указывает на N байт. Как преобразовать его в массив; Пробовал...

Проверка указателя на массив
Как нам проверить, что указатель указывает на пямять, выделенную в куче, а не на стеке? например такой код для простоты. Так как в таком...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru