Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 8

Странное поведение динамически создаваемого массива

23.10.2013, 01:34. Показов 962. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такая вот простенькая программа, тестирующая возможности динамической памяти:
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 <stdio.h>
int main(int argc,char* argv[])
{
    //Testirovat rabotu s dynamicheskoi pamyatju
    int* plist = NULL;
    int ilist;
    int icol = 0;
    int ncol = 4;
    int deal = 100;
    printf("Test of dynamic memory\r\n");
    plist = new int(deal);
    for (ilist = 0;ilist < deal;ilist++)
    {
        plist[ilist] = (ilist)*(ilist);//THIS IS PROBLEM!!!
    };
    for (ilist = 0;ilist < deal;ilist++)
    {
        printf("plist[%4d] = %4d; ",ilist,plist[ilist]);
        icol++;
        if (icol>=ncol) {printf("\r\n");icol = 0;}
    };
    delete[] plist;
    return 0;
}
Компилируем:
Bash
1
g++ -o testd testd.cpp
Запускаем:
Bash
1
./testd
Работает нормально:
Кликните здесь для просмотра всего текста
Test of dynamic memory
plist[ 0] = 0; plist[ 1] = 1; plist[ 2] = 4; plist[ 3] = 9;
plist[ 4] = 16; plist[ 5] = 25; plist[ 6] = 36; plist[ 7] = 49;
plist[ 8] = 64; plist[ 9] = 81; plist[ 10] = 100; plist[ 11] = 121;
plist[ 12] = 144; plist[ 13] = 169; plist[ 14] = 196; plist[ 15] = 225;
plist[ 16] = 256; plist[ 17] = 289; plist[ 18] = 324; plist[ 19] = 361;
plist[ 20] = 400; plist[ 21] = 441; plist[ 22] = 484; plist[ 23] = 529;
plist[ 24] = 576; plist[ 25] = 625; plist[ 26] = 676; plist[ 27] = 729;
plist[ 28] = 784; plist[ 29] = 841; plist[ 30] = 900; plist[ 31] = 961;
plist[ 32] = 1024; plist[ 33] = 1089; plist[ 34] = 1156; plist[ 35] = 1225;
plist[ 36] = 1296; plist[ 37] = 1369; plist[ 38] = 1444; plist[ 39] = 1521;
plist[ 40] = 1600; plist[ 41] = 1681; plist[ 42] = 1764; plist[ 43] = 1849;
plist[ 44] = 1936; plist[ 45] = 2025; plist[ 46] = 2116; plist[ 47] = 2209;
plist[ 48] = 2304; plist[ 49] = 2401; plist[ 50] = 2500; plist[ 51] = 2601;
plist[ 52] = 2704; plist[ 53] = 2809; plist[ 54] = 2916; plist[ 55] = 3025;
plist[ 56] = 3136; plist[ 57] = 3249; plist[ 58] = 3364; plist[ 59] = 3481;
plist[ 60] = 3600; plist[ 61] = 3721; plist[ 62] = 3844; plist[ 63] = 3969;
plist[ 64] = 4096; plist[ 65] = 4225; plist[ 66] = 4356; plist[ 67] = 4489;
plist[ 68] = 4624; plist[ 69] = 4761; plist[ 70] = 4900; plist[ 71] = 5041;
plist[ 72] = 5184; plist[ 73] = 5329; plist[ 74] = 5476; plist[ 75] = 5625;
plist[ 76] = 5776; plist[ 77] = 5929; plist[ 78] = 6084; plist[ 79] = 6241;
plist[ 80] = 6400; plist[ 81] = 6561; plist[ 82] = 6724; plist[ 83] = 6889;
plist[ 84] = 7056; plist[ 85] = 7225; plist[ 86] = 7396; plist[ 87] = 7569;
plist[ 88] = 7744; plist[ 89] = 7921; plist[ 90] = 8100; plist[ 91] = 8281;
plist[ 92] = 8464; plist[ 93] = 8649; plist[ 94] = 8836; plist[ 95] = 9025;
plist[ 96] = 9216; plist[ 97] = 9409; plist[ 98] = 9604; plist[ 99] = 9801;


Но стоит в исходном коде поменять строку:
C++
1
plist[ilist] = (ilist)*(ilist);//THIS IS PROBLEM!!!
на
C++
1
plist[ilist] = (ilist)*2;//THIS IS PROBLEM!!!
и скомпилировать программу, как после запуска выскакивает ошибка - причём ошибка судя по всему возникает на операторе delete[]:
Кликните здесь для просмотра всего текста
Test of dynamic memory
plist[ 0] = 0; plist[ 1] = 2; plist[ 2] = 4; plist[ 3] = 6;
plist[ 4] = 8; plist[ 5] = 10; plist[ 6] = 12; plist[ 7] = 14;
plist[ 8] = 16; plist[ 9] = 18; plist[ 10] = 20; plist[ 11] = 22;
plist[ 12] = 24; plist[ 13] = 26; plist[ 14] = 28; plist[ 15] = 30;
plist[ 16] = 32; plist[ 17] = 34; plist[ 18] = 36; plist[ 19] = 38;
plist[ 20] = 40; plist[ 21] = 42; plist[ 22] = 44; plist[ 23] = 46;
plist[ 24] = 48; plist[ 25] = 50; plist[ 26] = 52; plist[ 27] = 54;
plist[ 28] = 56; plist[ 29] = 58; plist[ 30] = 60; plist[ 31] = 62;
plist[ 32] = 64; plist[ 33] = 66; plist[ 34] = 68; plist[ 35] = 70;
plist[ 36] = 72; plist[ 37] = 74; plist[ 38] = 76; plist[ 39] = 78;
plist[ 40] = 80; plist[ 41] = 82; plist[ 42] = 84; plist[ 43] = 86;
plist[ 44] = 88; plist[ 45] = 90; plist[ 46] = 92; plist[ 47] = 94;
plist[ 48] = 96; plist[ 49] = 98; plist[ 50] = 100; plist[ 51] = 102;
plist[ 52] = 104; plist[ 53] = 106; plist[ 54] = 108; plist[ 55] = 110;
plist[ 56] = 112; plist[ 57] = 114; plist[ 58] = 116; plist[ 59] = 118;
plist[ 60] = 120; plist[ 61] = 122; plist[ 62] = 124; plist[ 63] = 126;
plist[ 64] = 128; plist[ 65] = 130; plist[ 66] = 132; plist[ 67] = 134;
plist[ 68] = 136; plist[ 69] = 138; plist[ 70] = 140; plist[ 71] = 142;
plist[ 72] = 144; plist[ 73] = 146; plist[ 74] = 148; plist[ 75] = 150;
plist[ 76] = 152; plist[ 77] = 154; plist[ 78] = 156; plist[ 79] = 158;
plist[ 80] = 160; plist[ 81] = 162; plist[ 82] = 164; plist[ 83] = 166;
plist[ 84] = 168; plist[ 85] = 170; plist[ 86] = 172; plist[ 87] = 174;
plist[ 88] = 176; plist[ 89] = 178; plist[ 90] = 180; plist[ 91] = 182;
plist[ 92] = 184; plist[ 93] = 186; plist[ 94] = 188; plist[ 95] = 190;
plist[ 96] = 192; plist[ 97] = 194; plist[ 98] = 196; plist[ 99] = 198;
*** glibc detected *** ./testd: free(): invalid next size (fast): 0x0938a008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x70f01)[0xb74e2f01]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x72768)[0xb74e4768]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(cfree+0x6d)[0xb74e781d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb76664bf]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb7488e46]
./testd[0x80484c1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:08 1392645 /home/vld64/Progi/dynamic/testd
08049000-0804a000 rw-p 00000000 08:08 1392645 /home/vld64/Progi/dynamic/testd
0938a000-093ab000 rw-p 00000000 00:00 0 [heap]
b7300000-b7321000 rw-p 00000000 00:00 0
b7321000-b7400000 ---p 00000000 00:00 0
b7470000-b7472000 rw-p 00000000 00:00 0
b7472000-b75ce000 r-xp 00000000 08:06 2212718 /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b75ce000-b75cf000 ---p 0015c000 08:06 2212718 /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b75cf000-b75d1000 r--p 0015c000 08:06 2212718 /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b75d1000-b75d2000 rw-p 0015e000 08:06 2212718 /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b75d2000-b75d5000 rw-p 00000000 00:00 0
b75d5000-b75f1000 r-xp 00000000 08:06 2195460 /lib/i386-linux-gnu/libgcc_s.so.1
b75f1000-b75f2000 rw-p 0001b000 08:06 2195460 /lib/i386-linux-gnu/libgcc_s.so.1
b75f2000-b75f3000 rw-p 00000000 00:00 0
b75f3000-b7617000 r-xp 00000000 08:06 2212715 /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b7617000-b7618000 r--p 00023000 08:06 2212715 /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b7618000-b7619000 rw-p 00024000 08:06 2212715 /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b7619000-b76f9000 r-xp 00000000 08:06 1542216 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b76f9000-b76fd000 r--p 000e0000 08:06 1542216 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b76fd000-b76fe000 rw-p 000e4000 08:06 1542216 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b76fe000-b7705000 rw-p 00000000 00:00 0
b771d000-b7720000 rw-p 00000000 00:00 0
b7720000-b7721000 r-xp 00000000 00:00 0 [vdso]
b7721000-b773d000 r-xp 00000000 08:06 2195478 /lib/i386-linux-gnu/ld-2.13.so
b773d000-b773e000 r--p 0001b000 08:06 2195478 /lib/i386-linux-gnu/ld-2.13.so
b773e000-b773f000 rw-p 0001c000 08:06 2195478 /lib/i386-linux-gnu/ld-2.13.so
bfcd6000-bfcf7000 rw-p 00000000 00:00 0 [stack]
Аварийный останов


То есть при заполнении массива одними числами ошибки не возникает, а при заполнении другими - возникает.
В чём может быть причина столь странного поведения?

P.S. Дистрибутив Debian 7.0
Версия g++ (Debian 4.7.2-5) 4.7.2
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.10.2013, 01:34
Ответы с готовыми решениями:

Странное поведение массива
Есть класс-наследник. Определено поле и метод. Не смотря на то что в поле записываются данные только при выполнение условия при деббаге в...

AutoCAD: странное поведение массива
Приветствую, уважаемый ALL! Сразу говорю - я далеко не спец, пишу исключительно для себя по необходимости и иногда имею длительные...

Странное поведение при использовании массива как параметра
Всем привет. Есть след. метод: static void MixArray&lt;T&gt;(T arr) { Random rand = new...

3
18 / 18 / 4
Регистрация: 05.05.2013
Сообщений: 88
23.10.2013, 01:53
Сейчас возможности закомпилить нету, но Вы попробуйте скомпилить другим компилятором, например gcc.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
23.10.2013, 02:21
Цитата Сообщение от Murzei Посмотреть сообщение
plist = new int(deal);
Здесь создается не динамический массив интов, а один инт, проинициализированный deal.
Нужно заменить скобки на [].
1
0 / 0 / 0
Регистрация: 16.09.2013
Сообщений: 8
23.10.2013, 10:07  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
Здесь создается не динамический массив интов, а один инт, проинициализированный deal.
Нужно заменить скобки на [].
Благодарю, помогло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.10.2013, 10:07
Помогаю со студенческими работами здесь

Парсинг динамически создаваемого контента
Как осуществить парсинг к примеру таких сайтов http://plusminus.by/ , кде содержимое(коэффициенты) постоянно обновляется(подгружается js)?

Ширина и высота динамически создаваемого объекта
Доброго времени суток! Такая ситуация: есть программа, в ходе работы которой создаются попеременно объекты типа: Tlabel и TImage. ...

Эффекты появления динамически создаваемого компонента
Подскажите, пожалуйста, как создавать динамически компоненты не просто &quot;появился&quot;, а как-нибудь красивше, км примеру плавно и т.д....

Прозрачность для динамически создаваемого div
почему-то не устанавливается прозрачность для динамически создаваемого div: var elemdiv = document.createElement('div'); ...

Высота/ширина динамически создаваемого элемента
Внутри таблицы создаю ImageButton и пытаюсь установить у нее высоту и ширину. //создаем таблицу TableLayout tableLayout =...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru