Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2009, 18:52   #1
Обледеневший
 
Регистрация: 14.09.2009
Сообщений: 9
По умолчанию Пожалуйста помогите найти ошибку =)

Код:
#include<iostream>

using namespace std;

char *a=NULL;
char *b[50000];

int main()
{
    a=new char[100];
    for(int i=0;i<100;i++,a[i]=*"q");
    cin.get(a,100);

    int g=0;
    while((a[g]!=*"q") && (g<100)){
        g++;
    };
    g-=2;

    int o;
    cin>>o;

    for(int l=0;l<50000;l++,b[l]=new char[50]);
    for(int i=0;i<o;i++)
        cin.get(b[i],50);

    return 0;
}
при ризервировании памяти для l программа аварийно завершается, немогу понять почему, буду благодарен за конструктивный коментарий по этому поводу
Обледеневший вне форума Ответить с цитированием
Старый 18.09.2009, 20:00   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Код:
for(int l=0;l<50000;l++,b[l]=new char[50]);
Ну кто вас так научил писать? НЕ пользуйтесь запятой, если не уверены в том, что знаете как это работает. Операции l++,b[l]=new char[50] выполняются последовательно слева направо, а значение выражения есть результат выполнения последней операции. В результате вы выходите из цикла так и не выделив памяти... Мой вам совет, пишите лучше в следующий раз вот так:

Код:
for(int l=0;l<50000;l++){b[l]=new char[50]};
Ну а сейчас для понтов можете вот так написать:

for(int l=0;l<5;b[l]=new char[50],l++);

Цитата:
при ризервировании памяти для l программа аварийно завершается, немогу понять почему, буду благодарен за конструктивный коментарий по этому поводу
У меня под l память нормально выделилась
mMAg вне форума Ответить с цитированием
Старый 18.09.2009, 20:23   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от mMAg
В результате вы выходите из цикла так и не выделив памяти...
Немного не понял, почему?..)
Цитата:
Сообщение от mMAg
Ну а сейчас для понтов можете вот так написать:

for(int l=0;l<5;b[l]=new char[50],l++);
Угу, ещё и так можно:
for(int l=0; l<50000;b[l++] = new char[50]);
А вообще память в цикле лучше не выделять, особенно в таком количестве и такими маленькими кусками. А раз уж выделяете, то лучше это, как сказал mMAg, пихнуть в тело цикла, дабы это было наглядней, плюс это может избавить вас от каких-нибудь неочевидных неприятных ситуаций.
netrino вне форума Ответить с цитированием
Старый 18.09.2009, 20:29   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

*"q" - какой ужас... и это лишь бы не писать 'q'
pu4koff вне форума Ответить с цитированием
Старый 18.09.2009, 22:23   #5
Обледеневший
 
Регистрация: 14.09.2009
Сообщений: 9
По умолчанию

Огромное спасибо всем
Обледеневший вне форума Ответить с цитированием
Старый 19.09.2009, 13:02   #6
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Немного не понял, почему?..)
Позволю себе ответить на этот вопрос.

Код:
for(int l=0;l<50000;l++,b[l]=new char[50]);
Ну, я думаю, тут все просто. Вот что происходит:
l = 0;
l < 50000? да, идем дальше;
l++ - в итоге l = 1;
b[1] = new char[50].
В итоге память под b[0] не выделяется, а выделяется под b[50000]. Совершенно не то, чего мы ожидали. Именно поэтому я и предложил написать:
Код:
for(int l=0;l<50000;l++,b[l]=new char[50]);
И так можно написать, сократив мою запись:
Код:
for(int l=0; l<50000;b[l++] = new char[50]);
Только вот зачем эти лишние мороки? Я никогда не использую 2 последних варианта. Ибо это сокращает написание, но повышает вероятность ошибки на усталости.
mMAg вне форума Ответить с цитированием
Старый 19.09.2009, 14:13   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А, Вы про нулевой элемент?) Я неправильно понял - решил, что Вы имеете ввиду, что не происходит ни одной итерации цикла)
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста найти ошибку в проге barbossa Общие вопросы C/C++ 6 01.06.2009 21:33
Не могу найти ошибку. Помогите, пожалуйста! Evgesha Помощь студентам 3 15.03.2009 14:04
Помогите пожалуйста найти ошибку (С\С++) Nina+ Помощь студентам 6 19.02.2009 22:30