Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
KostyaKulakov
Заблокирован
24.08.2012, 10:35     почему не работает? #1
решил по практиковаться с выделением динамической памяти:
почему не работает код:
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 10:35     почему не работает?
Посмотрите здесь:

C++ Почему не работает?
C++ почему не работает?
C++ Почему не работает???
Почему не работает C++
почему не работает? C++
Почему не работает? C++
Почему работает? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.08.2012, 10:40     почему не работает? #2
C++
1
for (int i =0; *a != '\0'; i++)
Круто. Если у тебя в цикле меняется i, то почему ты условие выхода проверяешь по *a? И почему, если у тебя это целые числа, ты сравниваешь с каким-то символом?
KostyaKulakov
Заблокирован
24.08.2012, 10:52  [ТС]     почему не работает? #3
Цитата Сообщение от Vourhey Посмотреть сообщение
C++
1
for (int i =0; *a != '\0'; i++)
Круто. Если у тебя в цикле меняется i, то почему ты условие выхода проверяешь по *a? И почему, если у тебя это целые числа, ты сравниваешь с каким-то символом?
и в правду я ошибся. спасибо. я хотел пробежать цикл до конца массива A
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.08.2012, 10:53     почему не работает? #4
Массив не С-строка. У него нет нулевого символа в конце.
KostyaKulakov
Заблокирован
24.08.2012, 10:54  [ТС]     почему не работает? #5
а как должна запись выглядить, чтобы получилось так как хочу?
Bomg
2 / 2 / 0
Регистрация: 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 нужна если у тебя много функций в которых создаются указатели, но потом они в главной программе не нужны - вот и освобождается память.
KostyaKulakov
Заблокирован
24.08.2012, 10:56  [ТС]     почему не работает? #7
Цитата Сообщение от Bomg Посмотреть сообщение
Хотел сделать видимо поинтересней а получилось как всегда.)) У тебя не строка символов, а массив целочисленный, так что eof не сработает.) самым простым будет поменять на size.
спасибо большое. те проверку делать на size. i < size?
ProgrC
 Аватар для ProgrC
9 / 9 / 1
Регистрация: 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;
}

Выводит значение и адрес, в котором оно хранится.
Bomg
2 / 2 / 0
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 11:02     почему не работает? #9
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
спасибо большое. те проверку делать на size. i < size?
да, если будет желание попрактикуйся еще с двойным указателем и там будет как раз поинтересней поглядеть адреса реальные в оперативной памяти.
KostyaKulakov
Заблокирован
24.08.2012, 11:02  [ТС]     почему не работает? #10
всем спасибо.
ProgrC
 Аватар для ProgrC
9 / 9 / 1
Регистрация: 17.08.2012
Сообщений: 43
24.08.2012, 11:03     почему не работает? #11
Цитата Сообщение от Bomg Посмотреть сообщение
нет смысла удалять в главной функции указатели, ведь они и так удалятся. Delete нужна если у тебя много функций в которых создаются указатели, но потом они в главной программе не нужны - вот и освобождается память.
Перестраховка никогда не повредит... =)
Bomg
2 / 2 / 0
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 11:04     почему не работает? #12
Цитата Сообщение от ProgrC Посмотреть сообщение
Перестраховка никогда не повредит... =)
То же верно, но это лишь для наглядности.)
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.08.2012, 11:05     почему не работает? #13
Bomg, Нет уж, лучше всегда действовать как действуете всегда (очищать память, если она была выделена).
Bomg
2 / 2 / 0
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 11:12     почему не работает? #14
Цитата Сообщение от ForEveR Посмотреть сообщение
Bomg, Нет уж, лучше всегда действовать как действуете всегда (очищать память, если она была выделена).
Но разве в его примере по завершению главной функции программа сама не очищает память?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.08.2012, 11:30     почему не работает? #15
Bomg, Очищает, но очищать память, если выделили является очень полезной и хорошей привычкой.
ProgrC
 Аватар для ProgrC
9 / 9 / 1
Регистрация: 17.08.2012
Сообщений: 43
24.08.2012, 11:40     почему не работает? #16
Цитата Сообщение от Bomg Посмотреть сообщение
Но разве в его примере по завершению главной функции программа сама не очищает память?
Очищать-то она очищает, но всегда стараются очищать явно. Смотри пост выше, там правильно сказано - что выделил, то и отчисти. Не нужно надеяться на то, что какая-то функция, кроме тебя самого, очистит за тебя память.
Bomg
2 / 2 / 0
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 11:43     почему не работает? #17
Цитата Сообщение от ForEveR Посмотреть сообщение
Bomg, Очищает. Но очищать память вручную, если она была выделена вручную, является очень полезной привычкой.
Понял, учту это.
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.08.2012, 11:52     почему не работает? #18
Цитата Сообщение от Bomg Посмотреть сообщение
То же верно, но это лишь для наглядности.)
Нет, не для наглядности. Даже если не обращать внимание, что это действительно "хорошая привычка", то, если не очищать память, то она будет зарезервирована приложением до конца его жизни. Даже если в приложении одна функция, ничто ей не мешает удерживать эту память до конца своей работы и, соответственно, зазря грузить оперативку теми данными, которые больше не нужны. А кол-во функций значения не имеет.
zss
Модератор
Эксперт С++
 Аватар для zss
6050 / 5653 / 1827
Регистрация: 18.12.2011
Сообщений: 14,443
Завершенные тесты: 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;
}
Поставьте останов в деструктор и убедитесь, что
он не вызывается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2012, 23:46     почему не работает?
Еще ссылки по теме:

C++ Почему не работает if-else
C++ Почему не работает?
C++ Почему не работает gets?
C++ Не работает. Почему?

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.08.2012, 23:46     почему не работает? #20
zss, Очищает ОС после завершения программы.
Yandex
Объявления
24.08.2012, 23:46     почему не работает?
Ответ Создать тему
Опции темы

Текущее время: 16:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru