Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
KostyaKulakov
Заблокирован
1

почему не работает?

24.08.2012, 10:35. Просмотров 682. Ответов 19
Метки нет (Все метки)

решил по практиковаться с выделением динамической памяти:
почему не работает код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int size;
    cin >> size;
 
    int *a = new int[size];
 
    for(int i=0; i < size; i++)
        a[i] = i;
 
    for (int i =0; *a != '\0'; i++)
        cout << a[i] << endl;
 
    delete[] a;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 10:35
Ответы с готовыми решениями:

Почему выводится в виде таблицы и почему не работает сортировка
почему выводится в виде таблицы? почему не работает сортировка? и как туда...

Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает
почему программа не работает на MFC статичной библиотеки. а вот на стандартном...

Почему в динамическом массиве не работает то, что работает со статическим?
Программа зависает #include&lt;iostream&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; ...

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

Не могу понять почему не работает (или правильно не работает)
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #define N 5 #define M 3 void...

19
Vourhey
Почетный модератор
6493 / 2268 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
24.08.2012, 10:40 2
C++
1
for (int i =0; *a != '\0'; i++)
Круто. Если у тебя в цикле меняется i, то почему ты условие выхода проверяешь по *a? И почему, если у тебя это целые числа, ты сравниваешь с каким-то символом?
1
KostyaKulakov
Заблокирован
24.08.2012, 10:52  [ТС] 3
Цитата Сообщение от Vourhey Посмотреть сообщение
C++
1
for (int i =0; *a != '\0'; i++)
Круто. Если у тебя в цикле меняется i, то почему ты условие выхода проверяешь по *a? И почему, если у тебя это целые числа, ты сравниваешь с каким-то символом?
и в правду я ошибся. спасибо. я хотел пробежать цикл до конца массива A
0
Vourhey
Почетный модератор
6493 / 2268 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
24.08.2012, 10:53 4
Массив не С-строка. У него нет нулевого символа в конце.
1
KostyaKulakov
Заблокирован
24.08.2012, 10:54  [ТС] 5
а как должна запись выглядить, чтобы получилось так как хочу?
0
Bomg
2 / 2 / 1
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 10:54 6
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
решил по практиковаться с выделением динамической памяти:
почему не работает код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int size;
    cin >> size;
 
    int *a = new int[size];
 
    for(int i=0; i < size; i++)
        a[i] = i;
 
    for (int i =0; *a != '\0'; i++)
        cout << a[i] << endl;
 
    delete[] a;
}
Хотел сделать видимо поинтересней а получилось как всегда.)) У тебя не строка символов, а массив целочисленный, так что eof не сработает.) самым простым будет поменять на size.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 #include <conio.h>
using namespace std;
 
int main()
{
    int size;
    cin >> size;
 
    int *a = new int[size];
 
    for(int i=0; i < size; i++)
        a[i] = i;
 
    for (int i =0; i<size; i++)
        cout << a[i] << endl;
        getche();
    delete[] a;
}
И если я не ошибаюсь нет смысла удалять в главной функции указатели, ведь они и так удалятся. Delete нужна если у тебя много функций в которых создаются указатели, но потом они в главной программе не нужны - вот и освобождается память.
1
KostyaKulakov
Заблокирован
24.08.2012, 10:56  [ТС] 7
Цитата Сообщение от Bomg Посмотреть сообщение
Хотел сделать видимо поинтересней а получилось как всегда.)) У тебя не строка символов, а массив целочисленный, так что eof не сработает.) самым простым будет поменять на size.
спасибо большое. те проверку делать на size. i < size?
0
ProgrC
9 / 9 / 3
Регистрация: 17.08.2012
Сообщений: 43
24.08.2012, 10:57 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <windows.h>
using namespace std;
 
int main()
{
    int size;
    cin >> size;
 
    int *a = new int[size];
 
    for(int i=0; i < size; i++)
        a[i] = i;
 
    for (int i=0; i < size; i++)
        cout << a[i] << " " << &a[i] << endl;
 
    delete[] a;
    system("pause");
    return 0;
}

Выводит значение и адрес, в котором оно хранится.
0
Bomg
2 / 2 / 1
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 11:02 9
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
спасибо большое. те проверку делать на size. i < size?
да, если будет желание попрактикуйся еще с двойным указателем и там будет как раз поинтересней поглядеть адреса реальные в оперативной памяти.
0
KostyaKulakov
Заблокирован
24.08.2012, 11:02  [ТС] 10
всем спасибо.
0
ProgrC
9 / 9 / 3
Регистрация: 17.08.2012
Сообщений: 43
24.08.2012, 11:03 11
Цитата Сообщение от Bomg Посмотреть сообщение
нет смысла удалять в главной функции указатели, ведь они и так удалятся. Delete нужна если у тебя много функций в которых создаются указатели, но потом они в главной программе не нужны - вот и освобождается память.
Перестраховка никогда не повредит... =)
0
Bomg
2 / 2 / 1
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 11:04 12
Цитата Сообщение от ProgrC Посмотреть сообщение
Перестраховка никогда не повредит... =)
То же верно, но это лишь для наглядности.)
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2012, 11:05 13
Bomg, Нет уж, лучше всегда действовать как действуете всегда (очищать память, если она была выделена).
0
Bomg
2 / 2 / 1
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 11:12 14
Цитата Сообщение от ForEveR Посмотреть сообщение
Bomg, Нет уж, лучше всегда действовать как действуете всегда (очищать память, если она была выделена).
Но разве в его примере по завершению главной функции программа сама не очищает память?
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2012, 11:30 15
Bomg, Очищает, но очищать память, если выделили является очень полезной и хорошей привычкой.
0
ProgrC
9 / 9 / 3
Регистрация: 17.08.2012
Сообщений: 43
24.08.2012, 11:40 16
Цитата Сообщение от Bomg Посмотреть сообщение
Но разве в его примере по завершению главной функции программа сама не очищает память?
Очищать-то она очищает, но всегда стараются очищать явно. Смотри пост выше, там правильно сказано - что выделил, то и отчисти. Не нужно надеяться на то, что какая-то функция, кроме тебя самого, очистит за тебя память.
0
Bomg
2 / 2 / 1
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 11:43 17
Цитата Сообщение от ForEveR Посмотреть сообщение
Bomg, Очищает. Но очищать память вручную, если она была выделена вручную, является очень полезной привычкой.
Понял, учту это.
0
Vourhey
Почетный модератор
6493 / 2268 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
24.08.2012, 11:52 18
Цитата Сообщение от Bomg Посмотреть сообщение
То же верно, но это лишь для наглядности.)
Нет, не для наглядности. Даже если не обращать внимание, что это действительно "хорошая привычка", то, если не очищать память, то она будет зарезервирована приложением до конца его жизни. Даже если в приложении одна функция, ничто ей не мешает удерживать эту память до конца своей работы и, соответственно, зазря грузить оперативку теми данными, которые больше не нужны. А кол-во функций значения не имеет.
0
zss
Модератор
Эксперт С++
7366 / 6772 / 4284
Регистрация: 18.12.2011
Сообщений: 17,901
Завершенные тесты: 1
24.08.2012, 21:52 19
Цитата Сообщение от ForEveR Посмотреть сообщение
Очищает,
Вы уверены?
Вот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
        int *p;
public:
    A(){p=new int[2];}
    ~A();
};
A::~A()
{
        delete[] p;
}
int main()
{
    A* a=new A;
    return 0;
}
Поставьте останов в деструктор и убедитесь, что
он не вызывается.
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2012, 23:46 20
zss, Очищает ОС после завершения программы.
0
24.08.2012, 23:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2012, 23:46

Почему не работает код на других компьютерах (на моем работает)?
вот задание: построить ф-ю: на вход поступают 2 строки, на выходе 1 строка, по...

Почему не работает cin.clear() и как работает sync()?
#include&lt;iostream&gt; #include&lt;cstring&gt; using namespace std;...

Теория. Почему в данном случае copy() не работает после reserve(), но работает после resize()?
Есть такая функция: void Array::SetStartIndexes(sz3_Arr_t *array) { ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru