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

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

02.05.2015, 15:14. Показов 1463. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью 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. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru