Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с памятью, Выдает ошибку обращения к памяти 
V
    Опции темы
greykardinal
Дата 1.6.2011, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



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

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 

Подскажите, в чем моя ошибка. Извините если тема ранее поднималась.
PM MAIL   Вверх
bsa
Дата 1.6.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



greykardinal, пройдись отладчиком. Наверняка L больше 10.
PM   Вверх
greykardinal
Дата 1.6.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) greykardinal - 1.6.2011, 14:02
PM MAIL   Вверх
bsa
Дата 1.6.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

Это сообщение отредактировал(а) bsa - 1.6.2011, 14:57
PM   Вверх
greykardinal
Дата 1.6.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) greykardinal - 1.6.2011, 15:55
PM MAIL   Вверх
xvr
Дата 1.6.2011, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

PM MAIL   Вверх
greykardinal
Дата 2.6.2011, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Цитата

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

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

Это сообщение отредактировал(а) greykardinal - 2.6.2011, 05:31
PM MAIL   Вверх
bsa
Дата 2.6.2011, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



greykardinal, выдели память под Len+1 чаров, и сделай Wx[Len] = '\0'; после выделения.
PM   Вверх
greykardinal
Дата 2.6.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



bsa, все равно ругается на строчку
Код

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

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

Это сообщение отредактировал(а) greykardinal - 2.6.2011, 10:23
PM MAIL   Вверх
greykardinal
Дата 2.6.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



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

Добавлено через 14 минут и 21 секунду
все, решил. smile 
bsaxvr, большое спасибо за помощь smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0869 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.