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

Почему код работает, хотя есть выход за пределы массива?

02.05.2015, 15:14. Показов 1439. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, собственно, хотел спросить. Почему этот код работает, несмотря на то, что в 35 строке массив выходит за пределы? Может я что-то путаю с выделением памяти?

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
 int N=4; //размер очереди
struct Queue
{
char **data;
char **data1;//массив данных
int size; //указатель на начало
};
 
 
 
void Creation(Queue *Q) //создание очереди
 
{
  Q->data = new char*[N];
Q->data1 = new char*[N];
Q->size=0;
    }
 
bool Full(Queue *Q) //проверка очереди на пустоту
 
{
if (Q->size==0) return true;
else return false;
}
 
 
void Add(Queue *Q) //добавление элемента
{
char *value = new char[30];
cout << "Enter the value " << endl; cin >> value;
Q->data[Q->size++]=value;
N++;
 Q->data1 = new char*[N];
for (int i = 0;i<Q->size;i++)
Q->data1[i] = Q->data[i];
;}
 
 
void Delete(Queue *Q) //удаление элемента
{
for (int i=0; i<Q->size; i++) //смещение элементов
Q->data1[i]=Q->data1[i+1]; Q->size--;
}
 
 
int Output(Queue *Q)
{
    cout << "Here is our little queue: ";
    for ( int j = 0;j<Q->size;j++)
    cout << Q->data1[j] << " ";
 
}
 
 
int Size(Queue *Q) //размер очереди
{
    return Q->size;
    }
 
string Peek(Queue *Q)
{
     string tmp;
         tmp = Q->data1[0];
     return tmp;
}
 
 
int main() //главная функция
{
Queue Q;
Creation(&Q);
int number;
 
do
{
cout << "1.Add new element" << endl;
cout << "2.Delete first element" << endl;
cout << "3.Output the queue" << endl;
cout << "4.Show the size of the queue" << endl;
cout << "5.Unload the first value" << endl;
cout << "0.Exit the programm" << endl;
cout << "What would you like to do with that little queue?  " << endl;
cin >> number;
switch (number)
{
case 1: Add(&Q);
break;
 
case 2:
if (Full(&Q)) cout << endl << "Queue is empty" << endl;
else
Delete(&Q);
 break;
 
case 3:
if (Full(&Q)) cout << endl << "Queue is empty" << endl;
else Output(&Q);
cout << endl;
break;
 
case 4:
if (Full(&Q)) cout << endl << "Queue is empty " << endl;
else cout << "Size of the queue is " << Size(&Q) << endl;
break;
 
case 5:
if (Full(&Q)) cout << endl << "Queue is empty " << endl;
else cout << "Here is out unload element " << Peek(&Q) << endl;
break;
 
case 0: exit(0);
 
default: cout << endl << "There is no such command " << endl;
break;
}
} while(number!='0');
return 0;
system("pause");
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2015, 15:14
Ответы с готовыми решениями:

Выход за пределы массива. Исправить код
Вот такой результат исполнения кода: 5 17 22 10.5 11.23 12.87 6.64 9.82 15.35 - ввел числа в массив с клавиатуры 5 5 17 17 22 22...

Считает почему то только первый код, на остальные пишет что код не найден, хотя он есть в списке, не понимаю п
Написать процедуру поиска в списке, расположенном на рабочем листе с именем «Цены» активной рабочей книги, кода товара, введенного с...

Почему та не работает код, хотя ошибок не выдает
При вводе текста &quot;выход&quot; в TextBox должно ввестись в Label текст &quot;приняла&quot;. Но почему та ни чего не происходит. public class DECCES ...

6
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
02.05.2015, 15:20
Цитата Сообщение от ShatteredMind Посмотреть сообщение
Q->data[Q->size++]=value;
N++;
*Q->data1 = new char*[N];
Цитата Сообщение от ShatteredMind Посмотреть сообщение
int N=4; //размер очереди
На первый взгляд все нормально, типа списка что-то
0
0 / 0 / 0
Регистрация: 02.05.2015
Сообщений: 11
02.05.2015, 15:24  [ТС]
Но ведь в этой строчке:
Q->data[Q->size++]=value;
Массив уходит за его пределы, если размер будет больше 4. Хотя он и работал, если размер начальный ноль поставить
0
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
02.05.2015, 15:36
size++
тут ++ после значит, что сначала она вернет значение, а потом прибавит к себе 1

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
int a[5]={0};
    for(int i=0;i<5;++i)
        a[i] = i;
    int i = 0;
        cout<<a[i]<<endl;
        i = 0;
        cout<<a[i++]<<endl;
        i = 0;
        cout<<a[++i]<<endl;
вот, попробуйте
0
0 / 0 / 0
Регистрация: 02.05.2015
Сообщений: 11
02.05.2015, 17:21  [ТС]
Все равно не понимаю, что значит ++ это ясно, но размер все равно будет слишком большим же.( Простите за тупость )
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
02.05.2015, 18:04
Лучший ответ Сообщение было отмечено ShatteredMind как решение

Решение

ShatteredMind, Во-первых, Ваша программа люто-бешено течет из всех щелей...
Например тут:
C++
1
  Q->data1 = new char *[N];
Кроме того, вы совершенно правы, валгринд вполне отмечает, invalid read и invalid write of size 8 - в строчках:
C++
1
  Q->data[Q->size++] = value; // invalid write
C++
1
  for (int i = 0; i < Q->size; i++) Q->data1[i] = Q->data[i]; // invalid read
А работает это потому-что undefined behaviour не всегда стреляет в ногу сразу. Может быть на другой версии компилятора, или с другими флагами оптимизации или с другой архитектурой процессора - оно вполне начнет работать не так, как сейчас. (Затрет чужую память, вызовет rm -rf, запустит Скайнет - кто знает?)
В любом случае не стоит полагаться на то, что здесь и сейчас оно заработало. Нужно переписать код так, чтобы не было обращений к не выделенным областям памяти и утечек.
0
0 / 0 / 0
Регистрация: 02.05.2015
Сообщений: 11
02.05.2015, 18:10  [ТС]
Спасибо большое за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2015, 18:10
Помогаю со студенческими работами здесь

Почему работает программа при выходе за пределы массива?
Добрый день, возникла проблема. Я задал одномерный массив из 10 элементов, однако, когда в я цикле пытаюсь присвоить значения большему...

Почему не работает код, хотя вроде всё правильно
Есть код. Предполагается, что при помещении текста в RichEdit текст будет подстраиваться под размеры окна. Rect: TRect; ...

Почему код не работает хотя ошибок нет? Что-то не так с выделением памяти?
#include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int n = 0; double a, b; ...

Выход за пределы массива
Тексты надо переписывать в сообщение! Я не как не пойму, где у меня выход за приделы массива Строчка 42 помогите плизз

Выход за пределы массива
В 7 строке выдает ошибку выхода за пределы массива. Никак не могу понять в чем ошибка def kvadrat(size): width=cell/(size*size*4) ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru