Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с памятью


Автор: greykardinal 1.6.2011, 12:24
Добрый день
Написал программу работы с текстовым файлом. Программа читает данные из файла, сортирует их , преобразует в число и раскладывает в двумерный массив.
Размер файла неизвестен, поэтому все размеры динамические.
Привожу код выделения памяти
Код

s = new char *[Len];
M=new float *[Len];
Wx = new char *[Len];
for (i=0;i<Len;i++)
        {s[i]= new char[Num_Channels*10];     // сюда читаем исходные данные
         M[i]= new float[Num_Channels];           // сюда складываем преобразованные данные         
        Wx[i]= new char[10];                             // временный массив
        for (int j=0;j<Num_Channels*10;j++) {s[i][j]='0'; }
        for (int j=0;j<Num_Channels;j++) {M[i][j]=0; }
        for (int j=0;j<10;j++) { Wx[i][j]='0';        }
        }


Проблема такая: Code Guard ругается на следующий участок кода:
Код

for (i=0;i<L;i++)
{ int j=0;
for (K=0;K<Num_Channels;)
        {
        do
                {ch=s[i][j];
                Wx[i][k++]=ch;
                j++;
                if (ch==';') K++;
                }
       while (ch!=';');
        m=A[K-1]-1;
        k=0;
        M[i][m]=atof(Wx[i]);          // ругается на эту строку, проблема с atof(Wx[i])
        }
K=0;
 
пишет "Attempt to access 11 bytes at ..., that is at heap bloc which is only 10 bytes long"

То бишь ему требуется на один байт больше чем я выделил. Но если выделить больше байт (1000) проблема не решается. smile 

Подскажите, в чем моя ошибка. Извините если тема ранее поднималась.

Автор: bsa 1.6.2011, 13:54
greykardinal, пройдись отладчиком. Наверняка L больше 10.

Автор: greykardinal 1.6.2011, 14:01
bsa, не понял причем тут L - это же другой размер массива. L должно быть не больше Len. Так то L больше 10

Автор: bsa 1.6.2011, 14:57
greykardinal, ругается у тебя на Wx[i], значит (если указатель Wx не меняется) i выходит за границу выделенной области. В цикле у тебя i от 0 до L невключительно. Значит, выход за груницу возможен, когда L больше Len.

Автор: greykardinal 1.6.2011, 15:53
bsa, согласен, возможно. Но я проверяю условие Len>L до приведенного кода. Если L>Len, то программа завершается принудительно. Тут все чисто smile 

Автор: xvr 1.6.2011, 16:38
Полагаю, что ругается на atof - Wx[i] это строка, и у ТС она явно не терминированна 0

Автор: greykardinal 2.6.2011, 05:14
Цитата

Полагаю, что ругается на atof - Wx[i] это строка, и у ТС она явно не терминированна 0

xvr, ругается именно на atof. Действительно, строка не терминирована. 
Спасибо за подсказку smile 
P.S. Подскажите, как исправить код, а то я никогда на подобное внимания не обращал и не знаю, что менять - может код выделения памяти, может сам тип данных?

Автор: bsa 2.6.2011, 09:55
greykardinal, выдели память под Len+1 чаров, и сделай Wx[Len] = '\0'; после выделения.

Автор: greykardinal 2.6.2011, 10:23
bsa, все равно ругается на строчку
Код

M[i][m]=atof(Wx[i]);

Пишет, что пытаюсь использовать 11 байт, а выделил только 10
Ругается уже при i=0

Автор: greykardinal 2.6.2011, 10:39
Попробовал vector - не получилось, std-ишные функции тоже не катят. Че делать - не знаю smile

Добавлено через 14 минут и 21 секунду
все, решил. smile 
bsa, xvr, большое спасибо за помощь smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)